优雅的方式删除孤儿行?

时间:2011-06-22 20:14:27

标签: mysql

我的表中包含许多包含客户ID的历史记录条目。

有一个单独的客户表。有时候会删除一些客户条目。

是否有一种简单的方法,在不循环遍历每个历史记录条目的情况下,删除历史记录表中客户ID不再存在的所有行,因为客户行已被删除?

5 个答案:

答案 0 :(得分:29)

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

你的意思是这样吗?

答案 1 :(得分:11)

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

我正在从头顶打字,但你希望得到这个想法。

Delete syntax documentation

答案 2 :(得分:6)

怎么样:

DELETE FROM history_table 
WHERE customer_id NOT IN (SELECT customer_id FROM customer);

答案 3 :(得分:5)

您可以使用级联与外键来实现此目的。在以下示例中,每次从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;

答案 4 :(得分:1)

DELETE FROM CUSTOMER_HISTORY CH
WHERE NOT EXISTS (SELECT 1 FROM CUSTOMER C WHERE C.CUSTOMER_ID = CH.CUSTOMER_ID)