2011-06-22 5 views
10

私は顧客IDを含む多くの履歴エントリを持つテーブルを持っています。孤立した行を削除するエレガントな方法ですか?

個別の顧客テーブルがあります。場合によっては、顧客エントリの一部が削除されることがあります。

お客様の行が削除されたため、顧客IDが存在しない履歴テーブルのすべての行を削除するために、各履歴エントリをループせずに簡単な方法はありますか?

+0

お客様が削除されるたびに、または定期的に削除を実行しますか? –

答えて

25
delete from history_table where customer_id not in (select customer_id from customers) 

あなたはこのような何かを意味しましたか?

+0

弱点は、自己結合(テーブルのparentidなど)を処理できないことです。適切な結合よりも遅いかもしれませんが、小さなテーブルではそれほど重要ではないかもしれません。 –

8
DELETE h.* FROM history h 
LEFT JOIN customer c ON h.customer_id = c.id 
WHERE c.id IS NULL 

私は頭の上からこれをタイプしていますが、うまくいけばいいと思います。

Delete syntax documentation

+0

これは適切な解決策です。 –

5

方法について:

DELETE FROM history_table 
WHERE customer_id NOT IN (SELECT customer_id FROM customer); 
1
DELETE FROM CUSTOMER_HISTORY CH 
WHERE NOT EXIST (SELECT 1 FROM CUSTOMER C WHERE C.CUSTOMER_ID = CH.CUSTOMER_ID) 
4

これを実行するには、外部キーでカスケードを使用できます。次の例では、行が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; 
関連する問題