为什么在密钥不存在的情况下,PostgreSQL会遇到重复的密钥?

时间:2019-04-07 13:28:36

标签: 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约束。但是当我检查目标表时,它不包含记录:

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

1 个答案:

答案 0 :(得分:2)

一个有根据的猜测,在源表book_backup20190405中可能有不止一行,它具有唯一的键元组('三銃', '', '')

由于批量INSERT INTO ... SELECT ...将是事务性的,因此您对错误的处理将更明智,因为在约束失败时所有数据都会回滚。

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

SELECT name, isbn, isbn10, COUNT(*) 
FROM public.book_backup20190405 
WHERE name = '三銃' 
GROUP BY name, isbn, isbn10 
HAVING COUNT(*) > 1;

查看是否有重复项。

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

http://sqlfiddle.com/#!17/29ba3