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

And*_*dha 35 sql-server

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

DELETE FROM table WHERE ...
Run Code Online (Sandbox Code Playgroud)

它返回以下错误

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

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

Chr*_*tow 41

您可以在删除之前和之后禁用并重新启用外键约束:

alter table MyOtherTable nocheck constraint all
delete from MyTable
alter table MyOtherTable check constraint all
Run Code Online (Sandbox Code Playgroud)

  • 如果禁用然后重新启用约束,由于"外键"引用中断,重新启用是否会失败? (6认同)
  • 好.这意味着子表中的所有数据都将保留在那里.我即将删除2k行,如果我将数据保存在子表中,我认为它会很笨重.我想我会手动完成它.无论如何,对于回复家伙来说.你值得+1 :) (3认同)
  • 不,它仅在您将新值写入字段时检查约束 - 当您将检查放回时,它不会重新扫描整个表。 (2认同)
  • 这似乎有点"kludge-y",但在我的特殊情况下,我很高兴找到了这个并且我正在使用它. (2认同)

Ada*_*ger 33

您需要手动删除子项.的<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>;
Run Code Online (Sandbox Code Playgroud)


Ala*_*Maw 20

如果您希望删除是自动的,则需要更改架构以便使用外键约束ON DELETE CASCADE.

有关更多信息,请参阅级联参照完整性约束MSDN页面.

ETA(在海报澄清之后):如果无法更新架构,则必须先手动删除受影响的子记录.


Sam*_*m T 9

在这里,您要为"Child"表添加外键

ALTER TABLE child
ADD FOREIGN KEY (P_Id)
REFERENCES parent(P_Id) 
ON DELETE CASCADE
ON UPDATE CASCADE;
Run Code Online (Sandbox Code Playgroud)

之后如果您在"父"表上进行DELETE查询,就像这样

DELETE FROM parent WHERE .....
Run Code Online (Sandbox Code Playgroud)

由于子项具有DELETE CASCADE对父项的引用,因此"Child"行也将被删除!和"父母"一起.