Коды ошибок PostgreSQL — это пятисимвольные строки стандарта SQLSTATE, которые сервер возвращает при любом нештатном завершении операции. Первые два символа обозначают класс ошибки, последние три — конкретное условие внутри класса. Зная класс, можно понять природу проблемы даже без точного кода. Эта страница — справочник всех кодов для актуальных версий PostgreSQL 14–17.
Как читать код ошибки PostgreSQL
Каждый код состоит из 5 символов: XXYYY, где XX — класс, YYY — подтип. Приложения должны сначала проверять код ошибки, а не текстовое сообщение — оно может меняться в зависимости от локали. Коды ошибок стабильны между версиями PostgreSQL.
Для каждого класса существует «базовый» код с тремя нулями в конце (XX000) — он используется, когда класс ошибки известен, но конкретное условие не определено. Коды вида XX P01, XX P02 — специфичные для PostgreSQL расширения стандарта SQL. Подробнее: Расшифровка кодов ошибок MySQL.
Класс 00 — Успешное завершение
00000
successful_completion
УСПЕШНОЕ ЗАВЕРШЕНИЕ — операция выполнена без ошибок.
Класс 01 — Предупреждение
01000
warning
ПРЕДУПРЕЖДЕНИЕ — общее предупреждение, которое не останавливает выполнение запроса.
0100C
dynamic_result_sets_returned
ВОЗВРАЩЕНЫ ДИНАМИЧЕСКИЕ НАБОРЫ РЕЗУЛЬТАТОВ — процедура вернула больше наборов результатов, чем ожидалось.
01008
implicit_zero_bit_padding
НЕЯВНОЕ ЗАПОЛНЕНИЕ НУЛЕВОГО БИТА — битовая строка неявно дополнена нулями до нужной длины.
01003
null_value_eliminated_in_set_function
NULL-ЗНАЧЕНИЕ ИСКЛЮЧЕНО В АГРЕГАТНОЙ ФУНКЦИИ — функция типа SUM, AVG проигнорировала NULL-значения в наборе.
01007
privilege_not_granted
ПРИВИЛЕГИЯ НЕ ПРЕДОСТАВЛЕНА — попытка выдать привилегию, которой нет у выдающего пользователя.
01006
privilege_not_revoked
ПРИВИЛЕГИЯ НЕ ОТОЗВАНА — попытка отозвать привилегию, которой нет у целевого пользователя.
01004
string_data_right_truncation
УСЕЧЕНИЕ ПРАВОЙ ЧАСТИ СТРОКИ — строковые данные были усечены при сохранении из-за ограничения длины поля.
01P01
deprecated_feature
УСТАРЕВШАЯ ФУНКЦИЯ — использована функция или синтаксис, помеченные как устаревшие в текущей версии PostgreSQL.
Класс 02 — Нет данных
02000
no_data
НЕТ ДАННЫХ — запрос выполнен успешно, но не вернул ни одной строки. Часто возникает в курсорах и хранимых процедурах.
02001
no_additional_dynamic_result_sets_returned
НЕТ ДОПОЛНИТЕЛЬНЫХ ДИНАМИЧЕСКИХ НАБОРОВ РЕЗУЛЬТАТОВ — все ожидаемые наборы результатов уже возвращены.
Класс 03 — SQL-запрос не завершён
03000
sql_statement_not_yet_complete
SQL-ЗАПРОС ЕЩЁ НЕ ЗАВЕРШЁН — запрос находится в процессе выполнения. Обычно возникает в асинхронных контекстах.
Класс 08 — Исключение соединения
08000
connection_exception
ИСКЛЮЧЕНИЕ СОЕДИНЕНИЯ — общая ошибка подключения к PostgreSQL-серверу.
08003
connection_does_not_exist
СОЕДИНЕНИЕ НЕ СУЩЕСТВУЕТ — попытка выполнить операцию по несуществующему или уже закрытому соединению.
08006
connection_failure
СБОЙ СОЕДИНЕНИЯ — соединение было разорвано в процессе работы. Проверьте сетевую доступность сервера и параметры pg_hba.conf.
08001
sqlclient_unable_to_establish_sqlconnection
КЛИЕНТ НЕ МОЖЕТ УСТАНОВИТЬ СОЕДИНЕНИЕ — клиент не смог подключиться к серверу. Проверьте хост, порт (по умолчанию 5432) и права доступа.
08004
sqlserver_rejected_establishment_of_sqlconnection
СЕРВЕР ОТКЛОНИЛ СОЕДИНЕНИЕ — сервер отверг попытку подключения, например из-за превышения лимита max_connections или ограничений в pg_hba.conf.
08007
transaction_resolution_unknown
СТАТУС ТРАНЗАКЦИИ НЕИЗВЕСТЕН — соединение потеряно до того, как сервер подтвердил статус транзакции (зафиксирована или отменена).
08P01
protocol_violation
НАРУШЕНИЕ ПРОТОКОЛА — клиент нарушил протокол обмена сообщениями с PostgreSQL. Обычно ошибка в драйвере или библиотеке.
Класс 09 — Исключение сработавшего действия
09000
triggered_action_exception
ИСКЛЮЧЕНИЕ СРАБОТАВШЕГО ДЕЙСТВИЯ — ошибка возникла внутри триггера.
Класс 0A — Функция не поддерживается
0A000
feature_not_supported
ФУНКЦИЯ НЕ ПОДДЕРЖИВАЕТСЯ — запрошенная возможность не реализована в текущей версии PostgreSQL.
Класс 0B — Некорректное инициирование транзакции
0B000
invalid_transaction_initiation
НЕКОРРЕКТНОЕ ИНИЦИИРОВАНИЕ ТРАНЗАКЦИИ — команда BEGIN была выполнена в недопустимом контексте.
Класс 0F — Исключение локатора
0F000
locator_exception
ИСКЛЮЧЕНИЕ ЛОКАТОРА — общая ошибка при работе с локаторами (LOB).
0F001
invalid_locator_specification
НЕДЕЙСТВИТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЛОКАТОРА — указан несуществующий или недействительный идентификатор LOB.
Класс 0L — Неверный грантодатель
0L000
invalid_grantor
НЕДЕЙСТВИТЕЛЬНЫЙ ГРАНТОДАТЕЛЬ — пользователь, пытающийся выдать привилегию, сам ею не владеет.
0LP01
invalid_grant_operation
НЕДОПУСТИМАЯ ОПЕРАЦИЯ GRANT — попытка выполнить недопустимую операцию выдачи прав.
Класс 0P — Неверная спецификация роли
0P000
invalid_role_specification
НЕДОПУСТИМАЯ СПЕЦИФИКАЦИЯ РОЛИ — указана несуществующая или недопустимая роль.
Класс 21 — Нарушение кардинальности
21000
cardinality_violation
НАРУШЕНИЕ КАРДИНАЛЬНОСТИ — подзапрос вернул более одной строки там, где ожидалась ровно одна. Например, при = (SELECT ...).
Класс 22 — Исключение данных
22000
data_exception
ИСКЛЮЧЕНИЕ ДАННЫХ — общая ошибка при обработке данных.
2202E
array_subscript_error
ОШИБКА ИНДЕКСА МАССИВА — индекс массива вышел за допустимые границы.
22021
character_not_in_repertoire
СИМВОЛ ОТСУТСТВУЕТ В РЕПЕРТУАРЕ — символ недопустим для текущей кодировки базы данных.
22008
datetime_field_overflow
ПЕРЕПОЛНЕНИЕ ПОЛЯ DATETIME — значение даты или времени вышло за допустимый диапазон.
22012
division_by_zero
ДЕЛЕНИЕ НА НОЛЬ — попытка деления на ноль. Обрабатывается через NULLIF(denominator, 0).
22005
error_in_assignment
ОШИБКА В ПРИСВАИВАНИИ — данные несовместимы с целевым типом при присваивании.
22022
indicator_overflow
ПЕРЕПОЛНЕНИЕ ИНДИКАТОРА — значение индикатора (для NULL) вышло за допустимый диапазон.
22015
interval_field_overflow
ПЕРЕПОЛНЕНИЕ ПОЛЯ INTERVAL — значение интервала превысило допустимый диапазон.
2201E
invalid_argument_for_logarithm
НЕДОПУСТИМЫЙ АРГУМЕНТ ДЛЯ ЛОГАРИФМА — передан нулевой или отрицательный аргумент в функцию ln() или log().
2201F
invalid_argument_for_power_function
НЕДОПУСТИМЫЙ АРГУМЕНТ ДЛЯ ФУНКЦИИ СТЕПЕНИ — недопустимое сочетание аргументов в функции power().
2201G
invalid_argument_for_width_bucket_function
НЕДОПУСТИМЫЙ АРГУМЕНТ ДЛЯ WIDTH_BUCKET — некорректные параметры функции width_bucket().
22018
invalid_character_value_for_cast
НЕДОПУСТИМОЕ ЗНАЧЕНИЕ ДЛЯ ПРИВЕДЕНИЯ ТИПА — строка содержит символы, несовместимые с целевым типом при CAST.
22007
invalid_datetime_format
НЕВЕРНЫЙ ФОРМАТ ДАТЫ/ВРЕМЕНИ — строка не соответствует ожидаемому формату даты или времени.
22019
invalid_escape_character
НЕДОПУСТИМЫЙ УПРАВЛЯЮЩИЙ СИМВОЛ — некорректный escape-символ в операторе LIKE.
22025
invalid_escape_sequence
НЕВЕРНАЯ ESCAPE-ПОСЛЕДОВАТЕЛЬНОСТЬ — строка содержит недопустимую escape-последовательность.
22P06
nonstandard_use_of_escape_character
НЕСТАНДАРТНОЕ ИСПОЛЬЗОВАНИЕ УПРАВЛЯЮЩЕГО СИМВОЛА — escape-символ использован нестандартным образом (специфика PostgreSQL).
22023
invalid_parameter_value
НЕДОПУСТИМОЕ ЗНАЧЕНИЕ ПАРАМЕТРА — аргумент функции содержит недопустимое значение.
2201B
invalid_regular_expression
НЕВЕРНОЕ РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ — синтаксическая ошибка в регулярном выражении.
22009
invalid_time_zone_displacement_value
НЕДОПУСТИМОЕ СМЕЩЕНИЕ ЧАСОВОГО ПОЯСА — значение UTC-смещения вышло за допустимые рамки.
22004
null_value_not_allowed
NULL-ЗНАЧЕНИЕ НЕ ДОПУСКАЕТСЯ — поле или параметр объявлены как NOT NULL, но получено значение NULL.
22002
null_value_no_indicator_parameter
NULL-ЗНАЧЕНИЕ БЕЗ ПАРАМЕТРА ИНДИКАТОРА — получено NULL при отсутствии обработчика NULL.
22003
numeric_value_out_of_range
ЧИСЛОВОЕ ЗНАЧЕНИЕ ВНЕ ДИАПАЗОНА — число слишком велико или мало для целевого типа (например, integer при значении больше 2 147 483 647).
22026
string_data_length_mismatch
НЕСООТВЕТСТВИЕ ДЛИНЫ СТРОКИ — длина строки не совпадает с ожидаемой.
22001
string_data_right_truncation
УСЕЧЕНИЕ СТРОКОВЫХ ДАННЫХ СПРАВА — строка длиннее, чем разрешено полем типа varchar(n) или char(n).
22011
substring_error
ОШИБКА ПОДСТРОКИ — некорректные аргументы функции substring().
22024
unterminated_c_string
НЕЗАВЕРШЁННАЯ C-СТРОКА — строка в стиле C не завершена нулевым байтом.
22P01
floating_point_exception
ИСКЛЮЧЕНИЕ ПЛАВАЮЩЕЙ ТОЧКИ — арифметическое исключение при работе с числами с плавающей точкой (деление на ноль, переполнение).
22P02
invalid_text_representation
НЕКОРРЕКТНОЕ ТЕКСТОВОЕ ПРЕДСТАВЛЕНИЕ — строка не может быть преобразована в целевой тип. Частая ошибка при передаче нечислового значения в числовое поле.
22P03
invalid_binary_representation
НЕКОРРЕКТНОЕ ДВОИЧНОЕ ПРЕДСТАВЛЕНИЕ — двоичные данные несовместимы с целевым типом.
Класс 23 — Нарушение ограничений целостности
23000
integrity_constraint_violation
НАРУШЕНИЕ ОГРАНИЧЕНИЯ ЦЕЛОСТНОСТИ — общее нарушение ограничений, наложенных на таблицу.
23502
not_null_violation
НАРУШЕНИЕ NOT NULL — попытка записать NULL в поле с ограничением NOT NULL.
23503
foreign_key_violation
НАРУШЕНИЕ ВНЕШНЕГО КЛЮЧА — вставка или обновление нарушает ограничение FOREIGN KEY: ссылочная строка не существует в родительской таблице.
23505
unique_violation
НАРУШЕНИЕ УНИКАЛЬНОСТИ — вставка дублирующего значения в поле с ограничением UNIQUE или PRIMARY KEY.
23514
check_violation
НАРУШЕНИЕ CHECK — значение не удовлетворяет условию ограничения CHECK.
Класс 24 — Неверное состояние курсора
24000
invalid_cursor_state
НЕДОПУСТИМОЕ СОСТОЯНИЕ КУРСОРА — операция с курсором выполнена в недопустимом состоянии (например, FETCH после закрытия).
Класс 25 — Неверное состояние транзакции
25000
invalid_transaction_state
НЕДЕЙСТВИТЕЛЬНОЕ СОСТОЯНИЕ ТРАНЗАКЦИИ — команда недопустима в текущем состоянии транзакции.
25001
active_sql_transaction
АКТИВНАЯ SQL-ТРАНЗАКЦИЯ — команда требует отсутствия активной транзакции.
25P01
no_active_sql_transaction
НЕТ АКТИВНОЙ SQL-ТРАНЗАКЦИИ — команда COMMIT или ROLLBACK без предшествующего BEGIN.
25P02
in_failed_sql_transaction
В УПАВШЕЙ SQL-ТРАНЗАКЦИИ — текущая транзакция завершилась с ошибкой; выполните ROLLBACK перед следующим запросом.
25006
read_only_sql_transaction
SQL-ТРАНЗАКЦИЯ ТОЛЬКО ДЛЯ ЧТЕНИЯ — попытка изменить данные в транзакции с режимом READ ONLY.
Класс 26 — Неверное имя SQL-оператора
26000
invalid_sql_statement_name
НЕДОПУСТИМОЕ ИМЯ SQL-ОПЕРАТОРА — обращение к подготовленному оператору с несуществующим именем.
Класс 27 — Нарушение правил изменения данных триггером
27000
triggered_data_change_violation
НАРУШЕНИЕ ПРАВИЛ ИЗМЕНЕНИЯ ДАННЫХ ТРИГГЕРОМ — триггер пытается изменить данные в нарушение установленных правил.
Класс 28 — Неверная спецификация авторизации
28000
invalid_authorization_specification
НЕДОПУСТИМАЯ СПЕЦИФИКАЦИЯ АВТОРИЗАЦИИ — неверные учётные данные. Обычно означает неверный пароль или отказ в доступе по pg_hba.conf.
Класс 2B — Зависимые дескрипторы привилегий существуют
2BP01
dependent_objects_still_exist
ЗАВИСИМЫЕ ОБЪЕКТЫ ВСЁ ЕЩЁ СУЩЕСТВУЮТ — попытка удалить роль или объект, от которого зависят другие объекты базы данных.
Класс 2D — Некорректное завершение транзакции
2D000
invalid_transaction_termination
НЕКОРРЕКТНОЕ ЗАВЕРШЕНИЕ ТРАНЗАКЦИИ — COMMIT или ROLLBACK в контексте, где они недопустимы.
Класс 2F — Исключение SQL-процедуры
2F002
modifying_sql_data_not_permitted
ИЗМЕНЕНИЕ SQL-ДАННЫХ ЗАПРЕЩЕНО — процедура пытается изменить данные там, где это запрещено.
2F003
prohibited_sql_statement_attempted
ПОПЫТКА ЗАПРЕЩЁННОГО SQL-ОПЕРАТОРА — процедура пытается выполнить запрещённый оператор.
Класс 34 — Неверное имя курсора
34000
invalid_cursor_name
НЕДОПУСТИМОЕ ИМЯ КУРСОРА — обращение к несуществующему или недопустимому курсору.
Класс 38 — Исключение внешней процедуры
38001
containing_sql_not_permitted
SQL В ЭТОМ КОНТЕКСТЕ ЗАПРЕЩЁН — внешняя функция не может содержать SQL-операторы.
Класс 39 — Исключение вызова внешней процедуры
39P01
trigger_protocol_violated
НАРУШЕН ПРОТОКОЛ ТРИГГЕРА — триггерная функция вернула некорректное значение.
39P02
srf_protocol_violated
НАРУШЕН ПРОТОКОЛ SRF — функция, возвращающая набор строк (Set Returning Function), нарушила протокол.
Класс 3B — Исключение точки сохранения
3B001
invalid_savepoint_specification
НЕВЕРНАЯ СПЕЦИФИКАЦИЯ SAVEPOINT — обращение к несуществующей или недопустимой точке сохранения.
Класс 3D — Неверное имя каталога
3D000
invalid_catalog_name
НЕДОПУСТИМОЕ ИМЯ КАТАЛОГА — указанная база данных не существует на сервере.
Класс 3F — Неверное имя схемы
3F000
invalid_schema_name
НЕКОРРЕКТНОЕ ИМЯ СХЕМЫ — указанная схема не существует в текущей базе данных.
Класс 40 — Откат транзакции
40001
serialization_failure
СБОЙ СЕРИАЛИЗАЦИИ — транзакция не может быть сериализована (конфликт блокировок). Решение: повторить транзакцию.
40P01
deadlock_detected
ОБНАРУЖЕНА ВЗАИМНАЯ БЛОКИРОВКА — две транзакции заблокировали друг друга. PostgreSQL автоматически откатывает одну из них. Решение: повторить транзакцию или пересмотреть порядок блокировок.
Класс 42 — Синтаксическая ошибка или нарушение правил доступа
42601
syntax_error
СИНТАКСИЧЕСКАЯ ОШИБКА — неверный синтаксис SQL-запроса.
42501
insufficient_privilege
НЕДОСТАТОЧНО ПРИВИЛЕГИЙ — пользователь не имеет прав для выполнения этой операции. Выдайте нужные права через GRANT.
42803
grouping_error
ОШИБКА ГРУППИРОВКИ — столбец в SELECT не включён в GROUP BY и не является агрегатной функцией.
42830
invalid_foreign_key
НЕДОПУСТИМЫЙ ВНЕШНИЙ КЛЮЧ — определение FOREIGN KEY некорректно.
42804
datatype_mismatch
НЕСООТВЕТСТВИЕ ТИПОВ ДАННЫХ — операнды несовместимых типов в выражении или сравнении.
42703
undefined_column
НЕОПРЕДЕЛЁННЫЙ СТОЛБЕЦ — столбец с таким именем не существует в указанной таблице.
42883
undefined_function
НЕОПРЕДЕЛЁННАЯ ФУНКЦИЯ — функция с такой сигнатурой (именем и типами аргументов) не существует.
42P01
undefined_table
НЕОПРЕДЕЛЁННАЯ ТАБЛИЦА — таблица или представление с таким именем не существует в текущей схеме.
42701
duplicate_column
ДУБЛИРУЮЩИЙСЯ СТОЛБЕЦ — попытка добавить столбец с именем, которое уже используется в таблице.
42P07
duplicate_table
ДУБЛИРУЮЩАЯСЯ ТАБЛИЦА — таблица или представление с таким именем уже существует.
42723
duplicate_function
ДУБЛИРУЮЩАЯСЯ ФУНКЦИЯ — функция с такой сигнатурой уже существует.
Класс 44 — Нарушение опции проверки
44000
with_check_option_violation
НАРУШЕНИЕ WITH CHECK OPTION — обновление через представление нарушает условие WITH CHECK OPTION.
Класс 53 — Недостаточно ресурсов
53100
disk_full
ДИСК ПЕРЕПОЛНЕН — на диске недостаточно места для завершения операции.
53200
out_of_memory
НЕДОСТАТОЧНО ПАМЯТИ — сервер исчерпал доступную оперативную память. Проверьте параметр work_mem в postgresql.conf.
53300
too_many_connections
СЛИШКОМ МНОГО СОЕДИНЕНИЙ — достигнут предел max_connections. Используйте пул соединений (PgBouncer) или увеличьте лимит.
Класс 54 — Превышен лимит программы
54001
statement_too_complex
СЛИШКОМ СЛОЖНЫЙ ЗАПРОС — запрос превысил ограничения по сложности (например, по глубине вложенности).
54011
too_many_columns
СЛИШКОМ МНОГО СТОЛБЦОВ — таблица или запрос содержит больше 1600 столбцов (ограничение PostgreSQL).
Класс 55 — Объект не в требуемом состоянии
55006
object_in_use
ОБЪЕКТ ИСПОЛЬЗУЕТСЯ — объект не может быть изменён, так как активно используется другим процессом.
55P03
lock_not_available
БЛОКИРОВКА НЕДОСТУПНА — не удалось получить блокировку при использовании NOWAIT.
Класс 57 — Вмешательство оператора
57014
query_canceled
ЗАПРОС ОТМЕНЁН — запрос был отменён пользователем или через pg_cancel_backend().
57P01
admin_shutdown
ОТКЛЮЧЕНИЕ АДМИНИСТРАТОРОМ — сервер остановлен командой pg_ctl stop или fast shutdown.
57P02
crash_shutdown
АВАРИЙНОЕ ОТКЛЮЧЕНИЕ — сервер аварийно завершил работу.
57P03
cannot_connect_now
НЕВОЗМОЖНО ПОДКЛЮЧИТЬСЯ СЕЙЧАС — сервер запускается или восстанавливается после сбоя.
Класс 58 — Системная ошибка
58030
io_error
ОШИБКА ВВОДА-ВЫВОДА — ошибка чтения или записи на диск. Проверьте файловую систему и диск.
58P01
undefined_file
ФАЙЛ НЕ НАЙДЕН — PostgreSQL не может найти необходимый файл данных.
Класс F0 — Ошибка файла конфигурации
F0000
config_file_error
ОШИБКА ФАЙЛА КОНФИГУРАЦИИ — синтаксическая ошибка в postgresql.conf, pg_hba.conf или другом конфигурационном файле.
F0001
lock_file_exists
ФАЙЛ БЛОКИРОВКИ СУЩЕСТВУЕТ — файл postmaster.pid уже существует. PostgreSQL не запустится, если предыдущий процесс не был корректно завершён.
Класс P0 — Ошибка PL/pgSQL
P0001
raise_exception
ЯВНОЕ ИСКЛЮЧЕНИЕ — в коде PL/pgSQL выполнена команда RAISE EXCEPTION.
P0002
no_data_found
ДАННЫЕ НЕ НАЙДЕНЫ — в PL/pgSQL запрос SELECT INTO не вернул ни одной строки.
P0003
too_many_rows
СЛИШКОМ МНОГО СТРОК — в PL/pgSQL запрос SELECT INTO вернул более одной строки.
Класс XX — Внутренняя ошибка
XX000
internal_error
ВНУТРЕННЯЯ ОШИБКА — ошибка внутри самого PostgreSQL. Сообщите разработчикам через систему отслеживания ошибок.
XX001
data_corrupted
ДАННЫЕ ПОВРЕЖДЕНЫ — повреждены данные на страницах базы данных. Требуется восстановление из резервной копии.
XX002
index_corrupted
ИНДЕКС ПОВРЕЖДЁН — повреждён индекс таблицы. Попробуйте REINDEX для восстановления.
FAQ
Что такое SQLSTATE и как его получить в приложении?
SQLSTATE — стандартный пятисимвольный код ошибки из стандарта SQL. В большинстве драйверов он доступен как свойство исключения: в Python (psycopg2) это e.pgcode, в Java — e.getSQLState(), в PHP — PDOException::getCode().
Как отличить ошибку приложения от ошибки сервера PostgreSQL?
Коды классов 00–2Z — стандартные SQL-ошибки (данные, транзакции, соединения). Коды классов начиная с 5X, XX — внутренние ошибки сервера или системы. Коды с буквой P — специфичные для PostgreSQL расширения.
Что делать при ошибке 42P01 (undefined_table)?
Проверьте: правильное ли имя таблицы, в правильной ли схеме вы работаете. Выполните SET search_path TO имя_схемы; или используйте полное имя: schema.table_name.
Как исправить ошибку 53300 (too_many_connections)?
Используйте пул соединений — PgBouncer или pgpool-II. Временное решение: увеличить max_connections в postgresql.conf (требует перезапуска сервера), но это увеличивает потребление памяти.
Почему возникает ошибка 40P01 (deadlock_detected)?
Взаимная блокировка возникает, когда две транзакции ждут освобождения ресурсов друг друга. PostgreSQL автоматически отменяет одну из них. Решение: обеспечить одинаковый порядок блокировки ресурсов во всех транзакциях.
Что означает класс ошибки, если я не знаю конкретный код?
Первые два символа всегда обозначают класс: 08 — проблемы соединения, 22 — неверные данные, 23 — нарушение ограничений, 42 — синтаксические ошибки и права, 53 — нехватка ресурсов. Этого часто достаточно для начальной диагностики.