批量插入时忽略冲突时不做任何子句

问题描述

只有存在于产品表中的产品才能添加到价目表中。

脚本

update pricelistnew set timestamp=to_char(Now(),'YYYYMMDDHH24MISS');

truncate pricelist;

insert into pricelist
select * from pricelistnew
on conflict do nothing;

抛出错误

错误:插入或更新表“pricelist”违反外键 约束“pricelist_product_fkey” 细节:钥匙 (product)=(TMMEM0EM00691BDS ) 不存在于表“product”中。

带有额外外键检查的脚本

insert into pricelist
select * from pricelistnew
where product in (select product  from product)
on conflict do nothing;

工作。

为什么忽略 on conflict do nothing 子句? 如何只添加与外键匹配的产品而不使用额外的检查

product in (select product  from product )

价目表有 300000 行,此命令在快速服务器上需要几分钟才能完成。它锁定表,以便其他同时运行的查询被延迟。如何有效地进行批量插入?

使用

Postgresql 13.2,由 Visual C++ build 1900 编译,64 位

更新

表结构:

create table product (
   product char(20) primary key );

create table pricelist ( product char(20) references product on update cascade on delete cascade deferrable,timestamp char(14),price numeric(12,2) );

create table pricelistnew ( product char(20),2) );

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)