如何构造一个INSERT语句,以便它不会生成错误"在表上插入或更新...违反外键约束"如果参考表中不存在外键值?
我只需要在这种情况下不创建记录和成功响应。
谢谢
答案 0 :(得分: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);
您没有向我们展示您的表格定义,因此我必须编写表格和列名称。你必须将它翻译成你的名字。
答案 1 :(得分: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错误。
当然,您可以更多地概括函数,以便能够插入多个表中,但您的问题听起来只有一个特定的表才需要。