删除具有外键约束且无级联删除 SQL 的行

Posted

技术标签:

【中文标题】删除具有外键约束且无级联删除 SQL 的行【英文标题】:Delete row with foreign key constraints and no cascade deleting SQL 【发布时间】:2014-08-08 01:19:37 【问题描述】:

试图弄清楚如何删除 SQL 表中具有多个指向它的外键的行,以及指向这些外键的更多键,等等。级联删除未打开(我无法控制打开它们打开),并且我试图避免对受此删除影响的每一行执行删除。

因此,如果我有表 XXX,其中 YYY 是主键,ZZZ 是具有多个指向它的外键的列,我将如何根据主键值删除一行?

语法是: 从 XXX 删除 WHERE YYY = some_value

这是否可能(无需执行大量单独删除)?如果是这样,我该怎么做?

【问题讨论】:

【参考方案1】:

没有。

要么你需要外键约束来级联删除(我不太喜欢的东西,它让一些应用程序/开发人员很容易认为他们可以删除并重新插入一些数据而不是更新它放置而不会无意中导致所有子行被删除),或者您必须在删除父行之前删除子行。

通常,如果要从子表中删除数据,只需手动编写各种DELETE 语句会更容易。可以查询数据字典(dba_constraintsdba_cons_columns 等)和动态 SQL 来遍历所有约束并生成适当的DELETE 语句。在绝大多数情况下,除非您尝试为大量表生成delete 语句,否则这样做是没有意义的。

【讨论】:

【参考方案2】:

关闭外键约束检查怎么样?

SET FOREIGN_KEY_CHECKS = 0;

然后在删除该行时将其重新打开?

SET FOREIGN_KEY_CHECKS = 1;

【讨论】:

感谢您为我更正这些,对不起,我才刚刚开始学习。:)

以上是关于删除具有外键约束且无级联删除 SQL 的行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL外键约束,级联删除

SQL外键约束&&多表查询&&级联删除&&子查询

SQL外键约束&&多表查询&&级联删除&&子查询

SQL外键约束&&多表查询&&级联删除&&子查询

如何在有外键关系的表中删除数据

传播级联删除引发外键约束失败