我有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
是特定于会话的。此外,它仍将强制执行约束;它只是在发出提交时执行此操作,而不是在执行语句时执行此操作。