在SQL Server表中使用外键删除数据

时间:2011-11-24 01:10:40

标签: sql-server

我要删除与另一个表(子)有关系的SQL Server表(父)中的数据。
我尝试了基本的删除查询。但它不起作用(我知道它不会)。

DELETE FROM table WHERE ...

它返回以下错误

  

DELETE语句与REFERENCE约束冲突...

我需要保留表的架构。我知道我只需要在查询中添加一些单词,我之前就已经这样做了,但我无法回忆起它。

10 个答案:

答案 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来自冲突表的相关行或更符合UPDATEFOREIGN 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