我要删除与另一个表(子)有关系的SQL Server表(父)中的数据。
我尝试了基本的删除查询。但它不起作用(我知道它不会)。
DELETE FROM table WHERE ...
它返回以下错误
DELETE语句与REFERENCE约束冲突...
我需要保留表的架构。我知道我只需要在查询中添加一些单词,我之前就已经这样做了,但我无法回忆起它。
答案 0 :(得分:37)
您可以在删除之前和之后禁用并重新启用外键约束:
alter table MyOtherTable nocheck constraint all
delete from MyTable
alter table MyOtherTable check constraint all
答案 1 :(得分:30)
您需要手动删除子项。 <condition>
对于两个查询都是相同的。
DELETE FROM child
FROM cTable AS child
INNER JOIN table AS parent ON child.ParentId = parent.ParentId
WHERE <condition>;
DELETE FROM parent
FROM table AS parent
WHERE <condition>;
答案 2 :(得分:18)
如果您希望删除是自动的,则需要更改架构,以便外键约束为ON DELETE CASCADE
。
有关详细信息,请参阅MSDN page on Cascading Referential Integrity Constraints。
ETA(在海报澄清之后):如果您无法更新架构,则必须先手动删除受影响的子记录。
答案 3 :(得分:9)
这里是为“Child”表添加外键
ALTER TABLE child
ADD FOREIGN KEY (P_Id)
REFERENCES parent(P_Id)
ON DELETE CASCADE
ON UPDATE CASCADE;
之后如果您在“父”表上进行DELETE查询,就像这样
DELETE FROM parent WHERE .....
由于子项具有DELETE CASCADE对父项的引用,因此“Child”行也将被删除!和“父母”一起。
答案 4 :(得分:3)
因此,您需要DELETE
来自冲突表的相关行或更符合UPDATE
其FOREIGN KEY
列的相关行,以引用父表中的其他PRIMARY KEY
。< / p>
另外,您可能需要阅读这篇文章Don’t Delete – Just Don’t
答案 5 :(得分:2)
要从具有parent_child关系的表中删除数据, 首先,您必须通过提及连接从子表中删除数据,然后只需从父表中删除数据,示例如下:
DELETE ChildTable
FROM ChildTable inner join ChildTable on PParentTable.ID=ChildTable.ParentTableID
WHERE <WHERE CONDITION>
DELETE ParentTable
WHERE <WHERE CONDITION>
答案 6 :(得分:0)
有用的脚本,您可以删除数据库的所有表中的所有数据, 用你的数据库名称替换tt:
true
答案 7 :(得分:0)
SET foreign_key_checks = 0; 从您的表中删除; SET foreign_key_checks = 1;
答案 8 :(得分:0)
我使用触发器来删除引用主键的条目。如果您不能更改架构,不确定您是否可以这样做,但这是 SQLite 中的一个示例:
CREATE TRIGGER remove_parent
BEFORE DELETE ON parent
BEGIN
DELETE FROM
child
WHERE
child.id = OLD.id;
END;
这样每次删除父条目时,子条目也将首先被删除。
答案 9 :(得分:-1)
只需在删除SQL语句之前和之后设置FOREIGN_KEY_CHECKS。
SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM table WHERE ...
DELETE FROM table WHERE ...
DELETE FROM table WHERE ...
SET FOREIGN_KEY_CHECKS = 1;
来源:https://alvinalexander.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys。