Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在不更新外键的情况下使用ON DELETE CASCADE_Mysql_Foreign Keys - Fatal编程技术网

Mysql 在不更新外键的情况下使用ON DELETE CASCADE

Mysql 在不更新外键的情况下使用ON DELETE CASCADE,mysql,foreign-keys,Mysql,Foreign Keys,我必须删除具有外键关系的多个表中的数据。我可以在外键定义中使用DELETE CASCADE上的规则轻松地执行此操作,但我不想这样做。我只想创建一个查询,它可以在不更新我的FK的情况下对DELETE CASCADE功能执行,但我不知道如何执行 我尝试创建多个delete语句,每个表一个,但这似乎太麻烦了 从具有FK关系的多个表中删除数据的最简单方法是什么?虽然删除级联上的是执行此操作的首选方法,但您也可以通过单个查询执行此操作,因为它支持从多个表中删除数据。如果您可以正确地联接表(通过表的外键关系

我必须删除具有外键关系的多个表中的数据。我可以在外键定义中使用DELETE CASCADE上的
规则轻松地执行此操作,但我不想这样做。我只想创建一个查询,它可以在不更新我的
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功能来相应地修改其他表

了解