MySQL Multi DELETE 如果与外键存在关系

标签 mysql sql innodb

我试图(在单个语句中)删除一行及其所有关系,即使所有这些关系都不存在。删除时级联不是选项,我宁愿避免子查询。

以下是由于外键关系而失败的示例:

CREATE TABLE test(id integer, title varchar(100), primary key(id));
INSERT into test(id, title) values(1, "Hello");
CREATE TABLE ref_a(id integer, test_id integer, primary key(id), key(test_id), constraint foreign key(test_id) references test(id));
INSERT into ref_a(id, test_id) values(1, 1);
CREATE TABLE ref_b(id integer, test_id integer, primary key(id), key(test_id), constraint foreign key(test_id) references test(id));
SET GLOBAL FOREIGN_KEY_CHECKS=1;


DELETE test, ref_a, ref_b FROM test
LEFT JOIN ref_a ON ref_a.test_id = test.id
LEFT JOIN ref_b ON ref_b.test_id = test.id
WHERE test.id = 1;

此操作失败并出现错误

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`product`.`ref_a`, CONSTRAINT `ref_a_ibfk_1` FOREIGN KEY (`test_id`) REFERENCES `test` (`id`))

这可以做到吗?

数据库是InnoDb。 MySql v 5.6.36

最佳答案

对于您的问题,有以下三个选项:

  1. 启用删除级联但这显然不是您的情况的选择

  2. 在运行查询之前禁用 foreign_key_checks,然后重新启用

  3. 运行两个查询;首先删除引用行(ref_aref_b),然后删除 test 中的行

否则你这是不可能的,这就是外键的用途;确保数据一致性。

关于MySQL Multi DELETE 如果与外键存在关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56854604/

相关文章:

java - 由中文字符组成的文本的 AES 加密问题

mysql - MySQL中如何获取这张表?

mysql - InnoDB : create foreign key with explicit index name

ORDER BY A*B 的 MySQL 索引

mysql - 如何区分哪些变量用于 innodb 引擎或 MyIsam 引擎?

mysql - 如何获取分组的条目并满足组内的限制?

mysql - 如何使用MySQL比较时间与当前时间并显示结果?

java - 如何存储 MySQL 数据库密码和用户名以访问数据库?

mysql - 更新与插入性能

mysql - 具有 4 个值(1 个或多个)的字段的建模问题