如何停止"在表格上插入或更新...违反外键约束"?

时间:2017-07-21 04:14:51

标签: postgresql

如何构造一个INSERT语句,以便它不会生成错误"在表上插入或更新...违反外键约束"如果参考表中不存在外键值?

我只需要在这种情况下不创建记录和成功响应。

谢谢

2 个答案:

答案 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错误。

当然,您可以更多地概括函数,以便能够插入多个表中,但您的问题听起来只有一个特定的表才需要。