如果在參考表中不存在外鍵值的情況下,如何構造INSERT語句以便它不會生成「在表上插入或更新...違反外鍵約束」的錯誤?如何停止「插入或更新表...違反外鍵約束」?
我只是不需要在這種情況下創建的記錄和成功的迴應。
謝謝
如果在參考表中不存在外鍵值的情況下,如何構造INSERT語句以便它不會生成「在表上插入或更新...違反外鍵約束」的錯誤?如何停止「插入或更新表...違反外鍵約束」?
我只是不需要在這種情況下創建的記錄和成功的迴應。
謝謝
使用查詢作爲源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);
你沒告訴我們你的表定義,所以我必須組成表和列的名稱。你將不得不把它翻譯成你的名字。
你可以創建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錯誤。
當然,您可以更多地概括函數,以便能夠插入到多個表中,但是您的問題聽起來像這樣只是針對一個特定表而需要的。
我在尋找一個聲明的解決方案 – spoonboy
爲什麼你需要一個班輪? –
有一種[在此處描述的技術](https://stackoverflow.com/a/36039580/314291),它在插入過程中連接回FK表,從而丟失具有無效參照完整性的行 – StuartLC