2016-11-08 25 views
0

怎麼能這樣一句話:此SQL語句如何引發以下異常?

DELETE FROM passage 
WHERE passageid NOT IN 
(
    SELECT passageid from PreEndedPassages_passages 
    UNION SELECT fromPassageid from severalvisit 
    UNION SELECT toPassageid from severalvisit 
    UNION SELECT registerPassageid from stationobjects WHERE registerpassageid IS NOT NULL 
    UNION SELECT beginPassageid from stationobjects WHERE beginPassageid IS NOT NULL 
    UNION SELECT endPassageid from stationobjects WHERE endPassageid IS NOT NULL 
) 

拋出此異常?

The DELETE statement conflicted with the FOREIGN KEY constraint "FK_statobj_begpasid". The conflict occurred in database "db.mdf", table "dbo.stationobjects", column 'beginpassageid'. 

我沒有線索,但它發生了。 beginPassageId是一個關於通道ID的外鍵。編輯: 考慮NOT IN。我想刪除其中一個相關表中不存在的所有段落。它通常有效,但它發生過一次。

謝謝。

+0

你確定這個關係是在段落(passageid)和stationobjects(beginPassageid)之間的關係。因爲你的查詢沒問題,它必須刪除,如果你指定的關係是對的 –

+0

是的。否則它不會拋出異常。 – Powerslave

回答

0

它表示通過是父表。而stationobjects是子表。您正嘗試從stationobjects表中存在的通道表中移除通道。

首先嚐試從stationobjects中刪除這些通道,然後您可以運行此刪除語句。

如果你的數據庫支持,替代方法是級聯刪除。

+0

嗯,我想刪除所有與其子表(不在)任何關係的所有段落,所以它不應該拋出這個異常。它通常工作,但我得到了一次.. – Powerslave

-1

當表A的外鍵是表B的主鍵,並且當您嘗試刪除表B中已鏈接的表A中的記錄時,會出現這種類型的錯誤,則刪除將不會發生。在刪除之前嘗試刪除外鍵關係。在表格中使用同樣的方法截斷fk關係,並在表格重置後重新使用它們

+0

外鍵關係有一個原因....這是不好的想法,就像這樣放棄它,如果他是一個存儲過程或視圖,通過桌子什麼的? – Veljko89

+0

考慮不在。它不應該拋出異常。 – Powerslave

0

當兩個表中存在外鍵關係時會發生這種情況。 這違反了Refrential Integrity。

所以如果你從主表中刪除記錄並且記錄存在於外鍵表中 那麼你有兩個選擇:
1.或者設置刪除規則級聯,這樣當你刪除主記錄時外鍵表記錄將被自動刪除。
2.先刪除外鍵表中的記錄,然後再刪除主鍵表中的記錄。

+0

請考慮NOT IN。它不應該拋出異常。 – Powerslave

+0

對不起,我沒有明白你的觀點 –