使用on delete cascade而不更新外键

6xfqseft  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(418)

我必须删除具有外键关系的多个表中的数据。我可以很容易地做到这一点 ON DELETE CASCADE 规则,但我不想这样做。我只想创建一个可以执行 ON DELETE CASCADE 无需更新我的 FK 但我不知道怎么做。
我尝试创建多个delete语句,每个表一个,但这似乎太麻烦了。
从具有fk关系的多表中删除数据的最简单方法是什么?

g6baxovj

g6baxovj1#

on delete cascade 是首选的方法,你也可以用一个 delete 查询,因为它支持从多个表中删除。如果可以正确地联接表(通常应该可以通过表的外键关系来联接),则可以立即从表中删除:
可以在delete语句中指定多个表,以根据where子句中的条件从一个或多个表中删除行。[…],只删除from子句之前列出的表中的匹配行。
例如,您可以使用:

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功能来相应地修改其他表。

相关问题