Когда я вставляю данные в 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
Я добавляю ограничение uniq для столбцов name, isbn, isbn10
. Но когда я проверяю таблицу назначения, она не содержит записи:
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
может быть более одной строки, которая имеет уникальный ключевой кортеж ('三銃', '', '')
.
Поскольку большая часть INSERT INTO ... SELECT ...
будет транзакционной, вы не будете знать об ошибке, поскольку все данные будут отброшены, когда ограничение не удастся.
Вы можете убедиться в этом, запустив проверку на дублирование исходной таблицы:
SELECT name, isbn, isbn10, COUNT(*)
FROM public.book_backup20190405
WHERE name = '三銃'
GROUP BY name, isbn, isbn10
HAVING COUNT(*) > 1;
Чтобы увидеть, есть ли дубликаты.
Вот пример того, как исходная таблица может быть единственным источником дубликатов:
Возможный дубликат stackoverflow.com/questions/30875185/…