为什么postgresql在密钥不存在时遇到重复密钥?

为什么postgresql在密钥不存在时遇到重复密钥?,postgresql,Postgresql,将数据插入Postgresql(9.6)时,抛出以下错误: ERROR: duplicate key value violates unique constraint "book_intial_name_isbn_isbn10_key" DETAIL: Key (name, isbn, isbn10)=(三銃士, , ) already exists. SQL state: 23505 我在name、isbn、isbn10列上添加了uniq约束。但当我检查distination表时,它不包

将数据插入Postgresql(9.6)时,抛出以下错误:

ERROR:  duplicate key value violates unique constraint "book_intial_name_isbn_isbn10_key"
DETAIL:  Key (name, isbn, isbn10)=(三銃士, , ) already exists.
SQL state: 23505
我在
name、isbn、isbn10
列上添加了uniq约束。但当我检查distination表时,它不包含以下记录:

select * from public.book where name like '%三銃%';
如何修复?这是我的插入sql:

insert into public.book
select *
from public.book_backup20190405 legacy
where legacy."name" not in
(
    select name
    from public.book
)
limit 1000

根据推测,源表
book_backup20190405
中可能有多行具有唯一键元组
('三銃', '', '')

由于批量
插入到…选择…
将是事务性的,因此您不会对错误更清楚,因为当约束失败时,所有数据都将回滚

您可以通过在源表上运行重复检查来验证这一点:

SELECT name, isbn, isbn10, COUNT(*) 
FROM public.book_backup20190405 
WHERE name = '三銃' 
GROUP BY name, isbn, isbn10 
HAVING COUNT(*) > 1;
看看是否有重复的

下面是一个示例,说明源表如何成为重复项的唯一来源:

可能存在的副本