SQL 服务器:根据外键删除行
SQL Server : Delete rows based on foreign key
我遇到了问题。假设我有 3 个表:
A [ID_A]
B [ID_A, ID_C]
C [ID_C]
经典的多对多关系。
我想删除 C 中的一行,并且所有关联的 A WHERE 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 first。我无法更改数据库以添加级联。
- 我不能删除所有“无关系a”因为我想保留a3
我觉得有一个明显的解决方案,但我无法解决...
,您可以在从 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';
我遇到了问题。假设我有 3 个表:
A [ID_A]
B [ID_A, ID_C]
C [ID_C]
经典的多对多关系。
我想删除 C 中的一行,并且所有关联的 A WHERE 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 first。我无法更改数据库以添加级联。
- 我不能删除所有“无关系a”因为我想保留a3
我觉得有一个明显的解决方案,但我无法解决...
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';