Mysql 在不更新外键的情况下使用ON DELETE CASCADE
我必须删除具有外键关系的多个表中的数据。我可以在外键定义中使用DELETE CASCADE上的Mysql 在不更新外键的情况下使用ON DELETE CASCADE,mysql,foreign-keys,Mysql,Foreign Keys,我必须删除具有外键关系的多个表中的数据。我可以在外键定义中使用DELETE CASCADE上的规则轻松地执行此操作,但我不想这样做。我只想创建一个查询,它可以在不更新我的FK的情况下对DELETE CASCADE功能执行,但我不知道如何执行 我尝试创建多个delete语句,每个表一个,但这似乎太麻烦了 从具有FK关系的多个表中删除数据的最简单方法是什么?虽然删除级联上的是执行此操作的首选方法,但您也可以通过单个查询执行此操作,因为它支持从多个表中删除数据。如果您可以正确地联接表(通过表的外键关系
规则轻松地执行此操作,但我不想这样做。我只想创建一个查询,它可以在不更新我的FK
的情况下对DELETE CASCADE
功能执行,但我不知道如何执行
我尝试创建多个delete语句,每个表一个,但这似乎太麻烦了
从具有FK关系的多个表中删除数据的最简单方法是什么?虽然删除级联上的是执行此操作的首选方法,但您也可以通过单个查询执行此操作,因为它支持从多个表中删除数据。如果您可以正确地联接表(通过表的外键关系,您应该能够轻松地联接表),则可以立即从表中删除:
根据WHERE子句中的条件,可以在DELETE语句中指定多个表来删除一个或多个表中的行。[…],仅删除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功能来相应地修改其他表
了解