私は顧客IDを含む多くの履歴エントリを持つテーブルを持っています。孤立した行を削除するエレガントな方法ですか?
個別の顧客テーブルがあります。場合によっては、顧客エントリの一部が削除されることがあります。
お客様の行が削除されたため、顧客IDが存在しない履歴テーブルのすべての行を削除するために、各履歴エントリをループせずに簡単な方法はありますか?
私は顧客IDを含む多くの履歴エントリを持つテーブルを持っています。孤立した行を削除するエレガントな方法ですか?
個別の顧客テーブルがあります。場合によっては、顧客エントリの一部が削除されることがあります。
お客様の行が削除されたため、顧客IDが存在しない履歴テーブルのすべての行を削除するために、各履歴エントリをループせずに簡単な方法はありますか?
delete from history_table where customer_id not in (select customer_id from customers)
あなたはこのような何かを意味しましたか?
弱点は、自己結合(テーブルのparentidなど)を処理できないことです。適切な結合よりも遅いかもしれませんが、小さなテーブルではそれほど重要ではないかもしれません。 –
DELETE h.* FROM history h
LEFT JOIN customer c ON h.customer_id = c.id
WHERE c.id IS NULL
私は頭の上からこれをタイプしていますが、うまくいけばいいと思います。
これは適切な解決策です。 –
方法について:
DELETE FROM history_table
WHERE customer_id NOT IN (SELECT customer_id FROM customer);
DELETE FROM CUSTOMER_HISTORY CH
WHERE NOT EXIST (SELECT 1 FROM CUSTOMER C WHERE C.CUSTOMER_ID = CH.CUSTOMER_ID)
これを実行するには、外部キーでカスケードを使用できます。次の例では、行がAから削除されたり、AのA_IDが変更されたりすると、この変更は自動的に表Bに反映されます。in the MySql Documentationの詳細はこちらを参照してください。
CREATE TABLE A(
A_ID INT,
PRIMARY_KEY(A_ID)
) TYPE=InnoDB;
CREATE TABLE B(
B_ID INT,
A_ID INT,
CONSTRAINT FK_B_A FOREIGN KEY REFERENCES A(A_ID) ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY_KEY(B_ID, A_ID)
) TYPE=InnoDB;
お客様が削除されるたびに、または定期的に削除を実行しますか? –