Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.

PostgreSQL Error 23505: unique_violation — дублирование первичных ключей

Обновлено: 25.08.2026  ·  Официальная база знаний
  • Ошибка выполнения: 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;
Практический опыт инженера: Если ошибка 23505 возникает на уникальном индексе, но дубликата в таблице физически нет, это явный симптом повреждения индекса (Index Corruption). Выполните REINDEX TABLE.

Частые вопросы (FAQ)

Почему sequence в PostgreSQL начинает возвращать уже существующие ID?

Это происходит, если в таблицу вставлялись строки с явным указанием ID (INSERT INTO ... VALUES (105, ...)) в обход вызова nextval(), либо после некорректного восстановления данных из бэкапа.

Как исправить ошибку нарушения уникальности в базе 1С:Предприятие?

Запустите процедуру 'Тестирование и исправление информационной базы' в Конфигураторе с установленным флагом 'Проверка логической и ссылочной целостности'.

Можно ли временно отключить проверку Unique Constraint?

Нет, уникальные ограничения в PostgreSQL проверяются строго в момент фиксации строки или транзакции (если ограничение создано как DEFERRABLE).

Как перестроить сразу все последовательности в схеме?

Используйте PL/pgSQL скрипт, обходящий все объекты информационной схемы и вызывающий setval() для каждого генератора.