我有Table_A和Table_B,Table_A是表_B的FK。我想从表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中删除?
我不想创建新表或类似的东西。 感谢。
答案 0 :(得分:2)
当然 - 使用临时表:
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
答案 1 :(得分:0)
如果约束是可延迟的,则以下内容将起作用:
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
是特定于会话的。此外,它仍将强制执行约束;它只是在发出提交时执行,而不是在执行语句时执行。