删除具有完整性约束的行



我有Table_A,Table_B Table_A FK来Table_B。我想从表 B 中删除一些行,所以我有一个查询,例如

DELETE FROM TABLE_B
WHERE TABLE_B.id IN(
    SELECT TABLE_A.B_id 
    FROM TABLE_A
    WHERE condition
)

因此,如果我尝试执行此操作,由于来自 A 的 FK,我会收到违反完整性约束的错误。

我遇到的问题是,如果我首先从Table_A中删除有问题的行(与condition匹配的行),内部 SELECT 不会返回预期的结果(因为这些行已被删除),因此删除不会按预期工作。

完全是SQL的菜鸟,所以我的问题是,我该怎么做?有没有办法存储内部选择的结果,然后从Table_A中删除行,然后从Table_B中删除?

我不想创建新表或类似的东西。谢谢。

当然 - 使用临时表:

SELECT TABLE_A.B_id 
INTO #TEMP_A
FROM TABLE_A
WHERE condition
DELETE FROM TABLE_A
WHERE B_id IN 
(SELECT B_id FROM #TEMP_A) 
DELETE FROM TABLE_B
WHERE id IN 
(SELECT B_id FROM #TEMP_A) 
DROP TABLE #TEMP_A

如果约束是可延迟的,则以下内容将起作用:

SET constraint fk_table_b_table_a DEFERRED;
DELETE FROM TABLE_B
WHERE TABLE_B.id IN(
    SELECT TABLE_A.B_id 
    FROM TABLE_A
    WHERE condition
);
DELETE TABLE_A
    WHERE condition
);

与禁用约束不同,将约束设置为 deferred 是特定于会话的。此外,它仍将强制执行约束;它只是在发出提交时执行此操作,而不是在执行语句时执行此操作。

最新更新