删除具有完整性约束的行

时间:2014-02-25 14:11:20

标签: sql oracle

我有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中删除?

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

2 个答案:

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