2016-10-03 231 views
-1

在我的Oracle數據庫中,我希望從2個不同的表中刪除行。如何在Oracle數據庫中同時執行2個表中的刪除操作?

問題是,如果我先從KENNEL中刪除行,那麼我想在DOG表中刪除的行不能被找到刪除。

以下是我的SQL statements從兩個表中刪除。

DELETE FROM KENNEL WHERE COUNTRY_ID IS NULL; 
DELETE FROM DOG WHERE ID IN (SELECT DOG_ID FROM KENNEL WHERE COUNTRY_ID IS NULL); 

我怎麼能解決這個問題,以使2只刪除發生在同時,並確保無論從表中的行被刪除?

注意:我無法從DOG中刪除KENNEL,因爲KENNEL是必須先刪除的子記錄。

+1

您可以簡單地從DOG首先刪除,然後從KENNEL刪除,如果出現錯誤,則處理異常以回滾兩個語句 – Aleksej

+0

我不能這樣做,因爲DOG和KENNEL之間存在約束,所以必須先刪除犬舍這是一個兒童記錄 – java123999

+0

你的桌子上有什麼樣的限制?請發佈所有相關約束條件的代碼 – Aleksej

回答

1

我會做這個集刪除的,就像這樣:

-- delete rows from child table first 
DELETE FROM KENNEL WHERE COUNTRY_ID IS NULL; 

-- now delete any parent rows that don't have any child records 
DELETE FROM DOG WHERE ID not exists (SELECT DOG_ID FROM KENNEL); 

這樣做,這樣意味着,如果不是全部在狗窩表給定dog_id的country_ids都爲空的,你止跌」試圖刪除父記錄 - 如果您嘗試過,則會出錯。

0
UPDATE DOG SET [some non-key field] = 'XXX' WHERE ID IN (SELECT DOG_ID FROM KENNEL WHERE COUNTRY_ID IS NULL); 

DELETE FROM KENNEL WHERE COUNTRY_ID IS NULL; 

DELETE FROM DOG WHERE [non-key field] = 'XXX'; 
+1

歡迎來到Stack Overflow!儘管這段代碼可以解決這個問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – gunr2171

相關問題