Что это значит

В таблице есть уникальный индекс или первичный ключ, и вставка или изменение дали значение, которое там уже есть. В тексте указано имя ограничения, а в строке 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');.

Что сделать

  1. Отставшую последовательность передвинуть за максимум:
SELECT setval('documents_id_seq', (SELECT max(id) FROM documents));
  1. После восстановления или переноса базы проверить так все последовательности, а не только ту, на которой упало.
  2. Разовые конфликты при одновременной вставке решать в приложении: повтором операции или вставкой с ON CONFLICT.