优雅的方式删除孤儿行?

p98*_*807 15 mysql

我有一个包含许多历史条目的表,其中包含客户ID.

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

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

hex*_*mal 30

delete from history_table where customer_id not in (select customer_id from customers)
Run Code Online (Sandbox Code Playgroud)

你的意思是这样的吗?

  • 它的弱点是它不能处理自我联接(例如表中的父母)。它可能也比适当的连接要慢...但是在小桌子上可能不重要。 (2认同)

Ais*_*ina 11

DELETE h.* FROM history h
LEFT JOIN customer c ON h.customer_id = c.id
WHERE c.id IS NULL
Run Code Online (Sandbox Code Playgroud)

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

删除语法文档


Ger*_*rat 6

怎么样:

DELETE FROM history_table 
WHERE customer_id NOT IN (SELECT customer_id FROM customer);
Run Code Online (Sandbox Code Playgroud)


Rya*_*oss 6

您可以使用级联与外键来实现此目的.在以下示例中,每次从A中删除行或更改A中的A_ID时,此更改将自动反映在表B中.您可以在MySql文档中阅读有关外键的更多信息.

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;
Run Code Online (Sandbox Code Playgroud)