我必须删除具有外键关系的多个表中的数据。我可以很容易地做到这一点 ON DELETE CASCADE 规则,但我不想这样做。我只想创建一个可以执行 ON DELETE CASCADE 无需更新我的 FK 但我不知道怎么做。我尝试创建多个delete语句,每个表一个,但这似乎太麻烦了。从具有fk关系的多表中删除数据的最简单方法是什么?
ON DELETE CASCADE
FK
g6baxovj1#
而 on delete cascade 是首选的方法,你也可以用一个 delete 查询,因为它支持从多个表中删除。如果可以正确地联接表(通常应该可以通过表的外键关系来联接),则可以立即从表中删除:可以在delete语句中指定多个表,以根据where子句中的条件从一个或多个表中删除行。[…],只删除from子句之前列出的表中的匹配行。例如,您可以使用:
on delete cascade
delete
CREATE TABLE parent ( id INT PRIMARY KEY ); CREATE TABLE child ( id INT PRIMARY KEY, parent_id INT, FOREIGN KEY (parent_id) REFERENCES parent (id) ); INSERT INTO parent(id) VALUES (1), (2), (3); INSERT INTO child(id, parent_id) VALUES (1,1), (2,1), (3,2), (4,2), (5,3), (6,3); SET FOREIGN_KEY_CHECKS=0; DELETE child, parent FROM child JOIN parent ON child.parent_id = parent.id WHERE parent.id = 1; SET FOREIGN_KEY_CHECKS=1;
您对删除顺序几乎没有控制权,而且在几乎所有情况下,mysql都倾向于使用违反外键约束的执行顺序(因为这可能是连接表的唯一可行方法),因此要使此方法起作用,您需要暂时禁用外键检查;另请参见手册中的备注:如果您使用一个涉及innodb表的multiple table delete语句,其中有外键约束,mysql优化器可能会按照不同于表的父/子关系的顺序处理表。在这种情况下,语句失败并回滚。相反,您应该从单个表中删除,并依赖innodb提供的on delete功能来相应地修改其他表。
1条答案
按热度按时间g6baxovj1#
而
on delete cascade
是首选的方法,你也可以用一个delete
查询,因为它支持从多个表中删除。如果可以正确地联接表(通常应该可以通过表的外键关系来联接),则可以立即从表中删除:可以在delete语句中指定多个表,以根据where子句中的条件从一个或多个表中删除行。[…],只删除from子句之前列出的表中的匹配行。
例如,您可以使用:
您对删除顺序几乎没有控制权,而且在几乎所有情况下,mysql都倾向于使用违反外键约束的执行顺序(因为这可能是连接表的唯一可行方法),因此要使此方法起作用,您需要暂时禁用外键检查;另请参见手册中的备注:
如果您使用一个涉及innodb表的multiple table delete语句,其中有外键约束,mysql优化器可能会按照不同于表的父/子关系的顺序处理表。在这种情况下,语句失败并回滚。相反,您应该从单个表中删除,并依赖innodb提供的on delete功能来相应地修改其他表。