当我将数据插入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
答案 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;
查看是否有重复项。
下面是一个示例,说明源表如何成为重复项的唯一来源: