我的表中包含许多包含客户ID的历史记录条目。
有一个单独的客户表。有时候会删除一些客户条目。
是否有一种简单的方法,在不循环遍历每个历史记录条目的情况下,删除历史记录表中客户ID不再存在的所有行,因为客户行已被删除?
答案 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
我正在从头顶打字,但你希望得到这个想法。
答案 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)