# Коды ошибок PostgreSQL — полная расшифровка на русском

> Сайт: allerrorcodes.ru · Факты сверены: 28.09.2026 · Обновлено: 28.09.2026 · Адрес: https://allerrorcodes.ru/postgresql/

## Коротко

- Код ошибки PostgreSQL — пятисимвольный SQLSTATE (например, 23505); произвольное число вида «8000» — это не он.
- Главная причина большинства — нарушение ограничений (23xxx), синтаксис (42xxx) или нехватка ресурсов (53xxx).
- Первое действие — определить класс по первым двум символам кода, затем найти точное условие в справочнике.
- Останавливайтесь и восстанавливайте из резервной копии при кодах класса XX (повреждение данных).

## Паспорт ошибки

| Параметр | Значение |
| --- | --- |
| Формат кода | SQLSTATE — 5 символов XXYYY: XX — класс, YYY — подтип |
| Где искать точно | postgresql.org Appendix A: PostgreSQL Error Codes (актуально для 14–18) |
| Как получить код в приложении | psycopg2: e.pgcode; Java: e.getSQLState(); PHP PDO: PDOException::getCode() |
| Первое действие | определить класс по первым двум символам, затем найти точный код в справочнике |
| Риск | без риска — сами коды не изменяют данные; REINDEX/восстановление из бэкапа при повреждении делайте с бэкапом заранее |
| Когда нужен специалист | повреждение данных (класс XX), устойчивые deadlock/serialization на проде, нехватка ресурсов при росте нагрузки |

Код ошибки PostgreSQL — это пятисимвольная строка стандарта SQLSTATE (например, **23505**), которую сервер возвращает при любом нештатном завершении операции. Первые два символа — класс ошибки, последние три — конкретное условие внутри класса. Справочник ниже — по актуальному [Appendix A: PostgreSQL Error Codes](https://www.postgresql.org/docs/current/errcodes-appendix.html) (действует для версий 14–18).

> Если вас привёл сюда запрос про **«8000 — неверный тип переданных данных»** — это не код PostgreSQL. SQLSTATE всегда состоит ровно из 5 символов вида `XXYYY` (например, 22P02), а «8000» на 4 цифры не подходит под этот формат. Скорее всего, это сообщение другой программы — например, кассового ПО, 1С или интеграции с банком/эквайрингом. Ищите расшифровку в документации именно той программы, где оно появилось, а не в справочнике PostgreSQL.

## Как читать код ошибки PostgreSQL

Каждый код — 5 символов: `XXYYY`, где `XX` — класс, `YYY` — подтип. Приложения должны проверять именно код, а не текст сообщения — текст меняется в зависимости от локали сервера, а код стабилен между версиями PostgreSQL.

Для каждого класса есть «базовый» код с тремя нулями (`XX000`) — он используется, когда класс известен, а точное условие не определено. Коды вида `XXP01`, `XXP02` — специфичные для PostgreSQL расширения стандарта SQL, а не общий стандарт. Смотрите также: [расшифровка кодов ошибок MySQL](https://allerrorcodes.ru/mysql/).

## Класс 00 — Успешное завершение

### 00000

`successful_completion`

Операция выполнена без ошибок.

## Класс 01 — Предупреждение

### 01000

`warning`

Общее предупреждение, не останавливающее выполнение запроса.

### 01003

`null_value_eliminated_in_set_function`

Агрегатная функция (SUM, AVG) проигнорировала NULL-значения в наборе.

### 01004

`string_data_right_truncation`

Строковые данные усечены при сохранении из-за ограничения длины поля.

### 01P01

`deprecated_feature`

Использована функция или синтаксис, помеченные как устаревшие в текущей версии PostgreSQL.

## Класс 02 — Нет данных

### 02000

`no_data`

Запрос выполнен успешно, но не вернул ни одной строки — часто в курсорах и хранимых процедурах.

## Класс 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`.

## Класс 21 — Нарушение кардинальности

### 21000

`cardinality_violation`

Подзапрос вернул более одной строки там, где ожидалась ровно одна — например, при `= (SELECT ...)`.

## Класс 22 — Исключение данных

### 22000

`data_exception`

Общая ошибка при обработке данных.

### 22012

`division_by_zero`

Деление на ноль. Обрабатывается через `NULLIF(denominator, 0)`.

### 22007

`invalid_datetime_format`

Строка не соответствует ожидаемому формату даты или времени.

### 22003

`numeric_value_out_of_range`

Число слишком велико или мало для целевого типа (например, `integer` при значении больше 2 147 483 647).

### 22001

`string_data_right_truncation`

Строка длиннее, чем разрешено полем типа `varchar(n)` или `char(n)`.

### 22004

`null_value_not_allowed`

Поле или параметр объявлены как NOT NULL, но получено значение NULL.

### 22P02

`invalid_text_representation`

Строка не может быть преобразована в целевой тип — частая ошибка при передаче нечислового значения в числовое поле.

### 2201B

`invalid_regular_expression`

Синтаксическая ошибка в регулярном выражении.

## Класс 23 — Нарушение ограничений целостности

### 23000

`integrity_constraint_violation`

Общее нарушение ограничений, наложенных на таблицу.

### 23502

`not_null_violation`

Попытка записать NULL в поле с ограничением NOT NULL.

### 23503

`foreign_key_violation`

Вставка или обновление нарушает ограничение FOREIGN KEY: ссылочная строка не существует в родительской таблице.

### 23505

`unique_violation`

Вставка дублирующего значения в поле с ограничением UNIQUE или PRIMARY KEY.

### 23514

`check_violation`

Значение не удовлетворяет условию ограничения CHECK.

### 23P01

`exclusion_violation`

Нарушение ограничения EXCLUDE (взаимоисключающие значения по критерию).

## Класс 25 — Неверное состояние транзакции

### 25000

`invalid_transaction_state`

Команда недопустима в текущем состоянии транзакции.

### 25P02

`in_failed_sql_transaction`

Текущая транзакция завершилась с ошибкой — выполните ROLLBACK перед следующим запросом.

### 25006

`read_only_sql_transaction`

Попытка изменить данные в транзакции с режимом READ ONLY.

## Класс 28 — Неверная спецификация авторизации

### 28000

`invalid_authorization_specification`

Неверные учётные данные — обычно неверный пароль или отказ в доступе по `pg_hba.conf`.

### 28P01

`invalid_password`

Указан неверный пароль при аутентификации.

## Класс 3D/3F — Имена базы данных и схемы

### 3D000

`invalid_catalog_name`

Указанная база данных не существует на сервере.

### 3F000

`invalid_schema_name`

Указанная схема не существует в текущей базе данных.

## Класс 40 — Откат транзакции

### 40001

`serialization_failure`

Транзакция не может быть сериализована (конфликт блокировок при уровне изоляции SERIALIZABLE). Решение: повторить транзакцию.

### 40P01

`deadlock_detected`

Две транзакции заблокировали друг друга. PostgreSQL автоматически откатывает одну из них. Решение: повторить транзакцию или пересмотреть порядок блокировок.

## Класс 42 — Синтаксическая ошибка или нарушение правил доступа

### 42601

`syntax_error`

Неверный синтаксис SQL-запроса.

### 42501

`insufficient_privilege`

Пользователь не имеет прав для выполнения операции. Выдайте права через `GRANT`.

### 42703

`undefined_column`

Столбец с таким именем не существует в указанной таблице.

### 42883

`undefined_function`

Функция с такой сигнатурой (именем и типами аргументов) не существует.

### 42P01

`undefined_table`

Таблица или представление с таким именем не существует в текущей схеме.

### 42804

`datatype_mismatch`

Операнды несовместимых типов в выражении или сравнении.

### 42P07

`duplicate_table`

Таблица или представление с таким именем уже существует.

## Класс 53 — Недостаточно ресурсов

### 53100

`disk_full`

На диске недостаточно места для завершения операции.

### 53200

`out_of_memory`

Сервер исчерпал доступную оперативную память. Проверьте параметр `work_mem` в `postgresql.conf`.

### 53300

`too_many_connections`

Достигнут предел `max_connections`. Используйте пул соединений (PgBouncer) или увеличьте лимит.

## Класс 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.

### 57P03

`cannot_connect_now`

Сервер запускается или восстанавливается после сбоя — временно не принимает новые соединения.

## Класс XX — Внутренняя ошибка

### XX000

`internal_error`

Ошибка внутри самого PostgreSQL. Сообщите через [систему отслеживания ошибок](https://www.postgresql.org/support/submitbug/).

### XX001

`data_corrupted`

Повреждены данные на страницах базы данных. Требуется восстановление из резервной копии.

### XX002

`index_corrupted`

Повреждён индекс таблицы. Попробуйте `REINDEX` для восстановления.

## «Access violation» в pgAdmin или драйвере — это не SQLSTATE

> Сообщение вида «PostgreSQL exception: access violation writing 0x0000000000000000» или «pgAdmin exception access violation» — это не код ошибки сервера, а **сбой самого клиента** (pgAdmin, ODBC/JDBC-драйвера) на уровне операционной системы: обращение к недопустимому адресу памяти. PostgreSQL-сервер тут не виноват — сервер продолжает работать. Обновите pgAdmin/драйвер до актуальной версии; если сбой повторяется — сообщите разработчикам pgAdmin через их трекер с точным номером версии и шагами воспроизведения.

## Что делать, если ничего не помогло

- Проверьте журнал сервера — путь задаётся параметром `log_directory` в `postgresql.conf` (по умолчанию подкаталог `log` в каталоге данных).
- Получите точный код в приложении: в Python (`psycopg2`) — `e.pgcode`; в Java — `e.getSQLState()`; в PHP (`PDO`) — `PDOException::getCode()`.
- При повреждении данных (класс XX) — восстановите из резервной копии; регулярный `pg_dump` обязателен.
- Для лимитов соединений и ресурсов — разверните пул соединений (PgBouncer) вместо простого увеличения `max_connections`.

## Частые вопросы

### Что такое SQLSTATE и как его получить в приложении?

SQLSTATE — стандартный пятисимвольный код ошибки. В Python (`psycopg2`) — `e.pgcode`, в Java — `e.getSQLState()`, в PHP (`PDO`) — `PDOException::getCode()`.

### Код «8000 — неверный тип переданных данных» — это PostgreSQL?

Нет. SQLSTATE всегда 5 символов, а «8000» — 4 цифры без буквенного класса. Это сообщение другой системы (например, кассового или банковского ПО) — ищите расшифровку в её документации.

### Что делать при ошибке 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 автоматически отменяет одну из них. Решение — одинаковый порядок блокировки ресурсов во всех транзакциях.

### «Access violation» в pgAdmin — сервер повреждён?

Нет, это сбой самого клиента pgAdmin или драйвера на уровне ОС, а не ошибка сервера PostgreSQL. Обновите pgAdmin до актуальной версии.

## Источники

- [PostgreSQL Appendix A: PostgreSQL Error Codes (официальная документация, текущая версия 18.6)](https://www.postgresql.org/docs/current/errcodes-appendix.html)

## Ещё по теме

- [Не устанавливается обновление Windows: причины и как исправить](https://allerrorcodes.ru/kb5008212/): Обновление зависло или выдаёт ошибку — сначала запустите встроенное средство устранения неполадок Windows Update (в Windows 11: «Параметры» → «Система» → «Устранение неполадок»; в Windows 10: «Параметры» → «Обновление и безопасность» → «Устранение неполадок»).
- [Не работает кнопка Пуск в Windows 10 и 11 — причины и решение](https://allerrorcodes.ru/chto-delat-esli-ne-rabotaet-knopka-pusk-v-windows-10/): Меню «Пуск» в Windows 10 и 11 — отдельное UWP-приложение StartMenuExperienceHost; когда оно не установлено или не запускается для вашего пользователя, кнопка не реагирует.
- [Ошибка 0x80072F8F в Windows 10 и 11 — причины и способы исправления](https://allerrorcodes.ru/ustranenie-oshibki-obnovleniya-windows-0x80072f8f/): 0x80072F8F — ошибка SSL-соединения с серверами Microsoft: система не может проверить сертификат сервера.
- [Google Chrome не запускается в Windows 10 и 11 — причины и решение](https://allerrorcodes.ru/pochemu-ne-zapuskaetsya-google-chrome-v-windows/): Если Chrome не реагирует на запуск — вероятно, в фоне уже висит зависший процесс chrome.exe; завершите все его процессы в Диспетчере задач и запустите снова.
