PostgreSQL Error 23505: unique_violation — дублирование первичных ключей
- Ошибка выполнения:
ERROR: duplicate key value violates unique constraint "table_pkey" (SQLSTATE 23505). Detail: Key (id)=(105) already exists. - Сбой вставки новых записей в таблицы со счетчиками автоинкремента (IDENTITY / SEQUENCE).
- Нарушение уникальности номеров документов или кодов справочников в 1С.
1. Поиск дублирующихся значений
SELECT id, count(*)
FROM my_table
GROUP BY id
HAVING count(*) > 1;2. Синхронизация последовательности (Sequence) с максимальным ID
Частая причина ошибки — рассинхронизация счетчика после ручной вставки или импорта данных:
-- Перевод счетчика последовательности на актуальное максимальное значение
SELECT setval(
pg_get_serial_sequence('my_table', 'id'),
COALESCE(MAX(id), 1)
) FROM my_table;3. Использование конструкции UPSERT (ON CONFLICT)
Для бесконфликтной параллельной вставки используйте синтаксис ON CONFLICT:
INSERT INTO user_settings (user_id, theme)
VALUES (42, 'dark')
ON CONFLICT (user_id)
DO UPDATE SET theme = EXCLUDED.theme;4. Перестроение поврежденного уникального индекса
При повреждении страниц b-tree индекса выполните перестроение без блокировки чтения:
REINDEX INDEX CONCURRENTLY table_pkey; Частые вопросы (FAQ)
Почему sequence в PostgreSQL начинает возвращать уже существующие ID?
Это происходит, если в таблицу вставлялись строки с явным указанием ID (INSERT INTO ... VALUES (105, ...)) в обход вызова nextval(), либо после некорректного восстановления данных из бэкапа.
Как исправить ошибку нарушения уникальности в базе 1С:Предприятие?
Запустите процедуру 'Тестирование и исправление информационной базы' в Конфигураторе с установленным флагом 'Проверка логической и ссылочной целостности'.
Можно ли временно отключить проверку Unique Constraint?
Нет, уникальные ограничения в PostgreSQL проверяются строго в момент фиксации строки или транзакции (если ограничение создано как DEFERRABLE).
Как перестроить сразу все последовательности в схеме?
Используйте PL/pgSQL скрипт, обходящий все объекты информационной схемы и вызывающий setval() для каждого генератора.