2017-07-21 93 views
0

如果在參考表中不存在外鍵值的情況下,如何構造INSERT語句以便它不會生成「在表上插入或更新...違反外鍵約束」的錯誤?如何停止「插入或更新表...違反外鍵約束」?

我只是不需要在這種情況下創建的記錄和成功的迴應。

謝謝

+0

有一種[在此處描述的技術](https://stackoverflow.com/a/36039580/314291),它在插入過程中連接回FK表,從而丟失具有無效參照完整性的行 – StuartLC

回答

1

使用查詢作爲源INSERT語句:

insert into the_table (id, some_data, some_fk_column 
select * 
from ( 
    values (42, 'foobar', 100) 
) as x(id, some_data, some_fk_column) 
where exists (select * 
       from referenced_table rt 
       where rt.primary_key_column = x.some_fk_column); 

這也可以擴展到多行插入:

insert into the_table (id, some_data, some_fk_column 
select * 
from ( 
    values 
     (42, 'foobar', 100), 
     (24, 'barfoo', 101) 
) as x(id, some_data, some_fk_column) 
where exists (select * 
       from referenced_table rt 
       where rt.primary_key_column = x.some_fk_column); 

你沒告訴我們你的表定義,所以我必須組成表和列的名稱。你將不得不把它翻譯成你的名字。

0

你可以創建PLPGSQL的功能,這將插入一行,並捕捉異常:

CREATE FUNCTION customInsert(int,varchar) RETURNS VOID 
AS $$ 
BEGIN 
INSERT INTO foo VALUES ($1,$2); 
EXCEPTION 
WHEN foreign_key_violation THEN --do nothing 
END; 
$$ LANGUAGE plpgsql 

然後,您可以通過這個調用這個函數:

SELECT customInsert(1,'hello'); 

該函數嘗試將給定的參數插入到表foo中,並在出現時捕獲foreign_key_violation錯誤。

當然,您可以更多地概括函數,以便能夠插入到多個表中,但是您的問題聽起來像這樣只是針對一個特定表而需要的。

+0

我在尋找一個聲明的解決方案 – spoonboy

+0

爲什麼你需要一個班輪? –

相關問題