2017-10-10 62 views
3

我有兩個表pu如下:(PostgreSQL的9.3)如何在外鍵死鎖時刪除記錄?

CREATE TABLE p 
(
    pid integer NOT NULL, 
    uid integer, 
    CONSTRAINT p_fkey FOREIGN KEY (uid) 
     REFERENCES u (uid) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT 
); 


CREATE TABLE u 
(
    uid integer NOT NULL, 
    pid integer, 
    CONSTRAINT u_fkey FOREIGN KEY (pid) 
     REFERENCES p (pid) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT 
); 

p我:

pid  uid 
161556  176266 

u

uid  pid 
176266  161556 

我想做的事情:

DELETE FROM u WHERE uid=176266; 
DELETE FROM p WHERE pid=113116; 

但我不能。

ERROR: update or delete on table "u" violates foreign key constraint "p_fkey" on table "p" DETAIL: Key (uid)=(176266) is still referenced from table "p".

我明白錯誤,但我不知道我能做些什麼來刪除。

對此提出建議?

+0

這不是一個「僵局」。 – zerkms

+0

@zerkms它的死鎖定義。除非先刪除b,否則不能刪除a,除非先刪除b,否則不能刪除b。 – avi

回答

3

您可以在一個語句刪除兩行:

WITH x AS (
    DELETE FROM u WHERE uid = 176266 
) 
DELETE FROM p WHERE pid = 113116; 

這工作,因爲IMMEDIATE限制在聲明的最後檢查。該語句刪除兩行,並在語句結束時完成所有完整性約束。

+0

謝謝。它正在工作。你能解釋爲什麼這個工作?它如何避免僵局? – avi

+0

這個解釋夠了嗎? –

+0

太棒了!你在PostgreSQL文檔中的哪個地方讀過它? – avi

0

嘗試更新第一

update p set uid=0 where uid=176266; 
delete from u where uid=176266; 
update u set pid=0 where pid=113116; 
delete from p where pid=113116; 
+0

我知道這個選項,但它搞亂了我不喜歡的數據。對於這個解決方案,你還需要在u表中有uid = 0。 – avi

+0

@avi確實,我已更正它 –