2014-02-25 59 views
1

我有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不返回預期結果(因爲這些行已被刪除),所以Delete不會' t按預期工作。

我是完全noob在SQL中,所以我的問題是,我該怎麼做?有沒有辦法存儲內部選擇的結果,然後從Table_A中刪除行,然後從Table_B中刪除?

我不想創建一個新表或任何類似的東西。 謝謝。

+0

此問題爲您提供有關如何短時間禁用約束的信息:http://stackoverflow.com/questions/159038/can-foreign-key-constraints-be-temporarily-disabled-using-t- SQL。或者,你可以看看這裏的級聯刪除約束:http://stackoverflow.com/questions/6260688/sql-server-cascade-delete –

回答

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 
+0

對不起,我的無知,但是,符號#需要,或者我可以調用臨時表我想要什麼?某些原因,如果我使用它,我會得到一個錯誤... – mario595

+0

'#'表示一個臨時表 - 「#」後面的名稱可以是任何有效的SQL表名。你使用MS SQL Server嗎? –

+0

這是Oracle。我得到這個錯誤SQL錯誤:ORA-00911:無效字符 – mario595

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是特定的會話。此外,它仍然會強制約束;它只是在提交時發出,而不是在語句執行時執行。