SQL Server:删除基于外键的行



我遇到了一个问题。假设我有3张桌子:

A [ID_A]
B [ID_A, ID_C]
C [ID_C]

一种经典的多对多关系。

我想删除C中的一行,以及所有与a相关的a,其中a只与C相关。要明确的是:

[a1, a2, a3]
[[a1, c1], [a2, c1], [a1, c2]
[c1, c2]

我想删除c1和a1,而不是a2,因为a2也与c2相关,而不是a3,因为a3与c1无关。

我面临的问题是订单问题。

  • 我不能先删除B,因为如果我删除B,我就会丢失关于A和c1之间关联的信息
  • 由于外键的原因,我无法删除c或a。我无法更改数据库以添加级联
  • 我无法删除所有";没有关系a";因为我想保留a3

我觉得有一个明显的解决方案,但我做不到…

正如@SOS在评论中提到的,从B删除时可以使用OUTPUT子句来捕获A的任何相关ID。然后删除任何关联的A记录,但排除任何仍与另一个B记录关联的记录:

DECLARE @tmp TABLE (ID_A);
DELETE b
FROM B b
OUTPUT deleted.ID_A
INTO @tmp (ID_A)
WHERE b.ID_C = 'c1';
DELETE a
FROM A a
WHERE a.ID_A IN (
SELECT t.ID_A
FROM @tmp t
EXCEPT
SELECT b.ID_A
FROM B b
);
DELETE c
FROM C c
WHERE c.ID_C = 'c1';

最新更新