Найти тему

Как исправить ошибку Postgres: "23505: ERROR: duplicate key value violates unique constraint"?

Оглавление

Есть база 1С, работает на Postgres SQL. Сделали выгрузку в файл *.dt. а вот загрузить обратно не получатся, выходит ошибка:

Data uniqueness condition is violated.
An attempt to insert a non-unique value to unique index:
23505: ERROR: duplicate key value violates unique constraint "params_pkey"
DETAIL: Key (filename, partno)=(ibparams.inf, 0) already exists.
CONTEXT: COPY params, line 18

В этой статье расскажу по этапам, как удалось ее победить.

🔥 Для начала важное замечание!

Перед выполнением любых действий на рабочей базе сделайте резервную копию.

Если бэкап не выполняется стандартными способами, то обязательно скопируйте полностью каталог "DATA".

Я буду рассматривать решение вопроса на PostgresSQL for Windows. Каталог data по умолчанию расположен по такому пути: "C:\Program Files\PostgreSQL\11.14-2.1C\data"

🔴 Что произошло?

Есть база 1С, которая работает на Postgres, ее нужно было перенести в облачный сервис, сделали стандартную выгрузку в файл *.dt, но при загрузке все падало в ошибку, попытался решить проблему следующими способами:

  • Тестирование базы средствами СУБД;
  • Тестирование и исправление средствами 1С. Это помогло, но как решение у клиента не устраивало, так как тестирование занимает очень большое время и мы не укладывались в технологическое окно;
  • Пробовал загрузить в MS SQL, но выходила аналогичная ошибка;
Нарушено условие уникальности данных.
Попытка вставки неуникального значения в уникальный индекс.
Microsoft OLE DB Driver for SQL Server: Выполнение инструкции CREATE UNIQUE INDEX прервано, поскольку обнаружен повторяющийся ключ для объекта с именем "dbo.Params" и индекса с именем "PK__Params__3F5D91860BEA8D59". Повторяющееся значение ключа: (log.inf, 0).
HRESULT=80040E2F, HRESULT=80040E2F, SQLSrvr: SQLSTATE=42000, state=1, Seventy=10, native=1750, line=1
SQLSvr: SQLSTATE=23000, state=1, Seventy=10, native=1505, line=1
-2

🟢 Решение проблемы!

1. Надо найти эти проблемные записи и попробовать с ними что-то сделать.

Для начала зайдем в консоль psql. Откроем Командную строку (cmd.exe) и введем команду: 'psql -U postgres -d UT_1C', где postgres - имя пользователя СУБД, UT_1C имя нашей базы. После ввода нужно будет ввести пароль пользователя postgres.

Запуск консоли psql
Запуск консоли psql

2. Посмотрим на нашу ошибку:

23505: ERROR: duplicate key value violates unique constraint "params_pkey" DETAIL: Key (filename, partno)=(ibparams.inf, 0) already exists. CONTEXT: COPY params, line 18

В тексте ошибки есть информация в какой таблице у нас проблема, это params, а так же какие ключевые поля у нас дублируются — (filename, partno). Значения, которые совпадают это (ibparams.inf, 0).

Выберем записи по полям из ошибки — (filename, partno).

Выполним запрос: ‘select (filename, partno) from params;’

-4

При детальном изучении видно, что на самом деле в этой таблице есть дубль не по одному значению, а по двум:

  • (ibparams.inf, 0)
  • (log.inf, 0)

3. Посмотрим детально на эти записи. Отберем по полю filename

Выполним запрос: ‘select * from params where filename='ibparams.inf';’

-5

4. Да, в одной таблице две записи c одинаковыми ключами. Что там хранится конечно не поймешь, но давайте попробуем удалить вторую запись, она по времени была позже.

Выполним запрос: 'delete from params where filename='ibparams.inf' and partno=0 and datasize=206;'. В запросе я делаю отбор по полям filename, partno, datasize.

-6

Запись удалена:

-7

Проверяем, выполняем запрос: ‘select * from params where filename='ibparams.inf';’

-8

Отлично, осталась одна запись.

Повторяем действия с п.3 для значения (log.inf, 0).

5. После удаления записей делаем выгрузку в *.dt и пробуем загрузить.

Ошибка ушла, загрузка прошла успешно!

Еще статьи по теме:

Понравилась статья, поддержите лайком 👍