Вставка нарушает уникальность, часто из-за отставшей последовательности
«ERROR: duplicate key value violates unique constraint» (SQLSTATE 23505) в PostgreSQL: строка с таким ключом уже есть. Две частые причины: одновременная вставка одинаковых данных и последовательность, отставшая после восстановления или переноса базы.
Что это значит
В таблице есть уникальный индекс или первичный ключ, и вставка или изменение дали значение, которое там уже есть. В тексте указано имя ограничения, а в строке DETAIL сам ключ: Key (id)=(1043) already exists.
Разовые ошибки обычно означают, что два процесса одновременно вставили одинаковые данные. Ошибки на каждой вставке в таблицу с ключом из последовательности почти всегда значат, что последовательность отстала от данных: её текущее значение меньше максимального ключа в таблице. Так бывает после восстановления из копии, переноса данных скриптом или ручной вставки с явными значениями ключа.
Как проверить
SELECT max(id) FROM documents;
SELECT last_value FROM documents_id_seq;
Если last_value меньше max(id), последовательность отстала. Имя последовательности для столбца покажет SELECT pg_get_serial_sequence('documents', 'id');.
Что сделать
- Отставшую последовательность передвинуть за максимум:
SELECT setval('documents_id_seq', (SELECT max(id) FROM documents));
- После восстановления или переноса базы проверить так все последовательности, а не только ту, на которой упало.
- Разовые конфликты при одновременной вставке решать в приложении: повтором операции или вставкой с
ON CONFLICT.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать