当前位置: 首页 > 面试题库 >

从具有外部约束的多个表中删除

云宜人
2023-03-14
问题内容

我正在尝试从多个表中删除。这是我的桌子的样子

    A_has_B ---- B ---- C_has_B
(many to many)        (many to many)

给定B中的记录ID,我试图删除A_has_B,B和C_has_B中的所有行。我将MySQL与innodb存储引擎配合使用,并为A_has_B和C_has_B定义了引用B中ID的外键。

我正在尝试执行删除操作,如下所示:

DELETE A_has_B.*, C_has_B.*, B.*

FROM
A

join
B
on (B.B_id = A.B_id)

join
C
on (C.B_id = B.B_id)

where B.B_id IN(1,2, 4);

问题是当我执行查询时,mysql抱怨:

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (`db`.`C`, CONSTRAINT `fk_C` FOREIGN KEY (`B_id`) REFERENCES `B` (`B_id`) ON DELETE NO ACTION ON UPDATE NO)

我该如何解决这个问题?


问题答案:

最简单的方法是分别从每个表中删除:

-- Remove all connections from A which reference
-- the B-rows you want to remove
DELETE FROM A_has_B
WHERE B_id IN (1,2,4);

-- Remove all connections from C which reference
-- the B-rows you want to remove
DELETE FROM C_has_B
WHERE B_id IN (1,2,4);

-- Finally remove the B-rows
DELETE FROM B
WHERE B_id IN (1,2,4);

MySQL还允许您在一条语句中从多个表中删除。但是无法控制删除的顺序。从手册:

如果您使用涉及具有外键约束的InnoDB表的多表DELETE语句,则MySQL优化器可能以与其父/子关系不同的顺序处理表。在这种情况下,该语句将失败并回滚。相反,您应该从单个表中删除,并依靠InnoDB提供的ON
DELETE功能来相应地修改其他表。



 类似资料:
  • 在Sybase ASE中完全删除数据库中的所有表而不删除数据库的最佳方法是什么?我一直在使用一个脚本:从这个问题开始,由于引用完整性,我试图删除数据库中的所有表时出错。 在MySQL中,我可以使用 有没有办法在Sybase ASE中实现这一点,或者可以扩展上面的脚本来循环约束?

  • 问题内容: 如何使用phpMyAdmin在MySQL表的列上删除“唯一键约束”? 问题答案: 唯一约束也是索引。 首先使用来查找索引的名称。索引的名称存储在该查询结果中调用的列中。 然后,您可以使用DROP INDEX: 或ALTER TABLE语法:

  • 我有这样布局的模型: 这里的场景是我永远不希望用户删除数据。相反,删除只会隐藏记录。但是,我仍然希望所有非软删除的记录都遵循唯一的键约束。基本上,我希望有尽可能多的重复的已删除记录,但只有一个唯一的未删除记录可以存在。所以我本来想包括“已删除”字段(由django安全删除库提供),但问题是Django的唯一检查因“psycopg2”而失败。完整性错误:重复的键值违反了 ['field2', 'fi

  • 我试图从MySQL中的多个表中删除记录,但我不断得到一个错误,错误内容为。 这是我正在尝试运行的SQL语句: 我试过在删除级联上执行

  • 问题内容: 我有以下示例: 我想在级联排如果双方并从各自的表被删除。 删除两个外键后,如何在表C中级联自身? 如果仅删除一个FK,则受影响的行应在引用该外键的列中更改为空值。 问题答案: 我建议使用两个外键约束和一个触发器来处理其余的 表格: 扳机: SQL提琴。 确保连接表具有替代PK列。无论如何都不能是PK,因为那将不允许两者都为NULL。而是添加一个约束,该约束允许使用NULL值。 触发器针

  • 问题内容: 我想从表中删除约束。我的查询是: 但我得到一个错误: -您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’constraint ‘ 附近使用正确的语法 问题答案: Mysql具有用于删除外键约束的特殊语法: