PostgreSQL Error 23502: not_null_violation — обработка NULL значений
- Ошибка приложения:
ERROR: null value in column "status" of relation "orders" violates not-null constraint (SQLSTATE 23502). - Отказ выполнения команд
INSERTилиUPDATEпри передаче пропущенных полей. - Сбои заполнения реквизитов объектов метаданных при программной записи в 1С.
1. Поиск строк, содержащих недопустимые NULL значения
SELECT *
FROM orders
WHERE status IS NULL;2. Заполнение значений по умолчанию и добавление DEFAULT
-- 1. Заполнение существующих NULL значений
UPDATE orders SET status = 'pending' WHERE status IS NULL;
-- 2. Назначение значения по умолчанию на уровне схемы
ALTER TABLE orders ALTER COLUMN status SET DEFAULT 'pending';3. Безопасное добавление NOT NULL на больших таблицах (без долгих блокировок)
Начиная с PostgreSQL 12+, добавление NOT NULL со значением DEFAULT выполняется мгновенно без перезаписи таблицы:
-- Быстрое добавление ограничения через валидацию CHECK
ALTER TABLE orders ADD CONSTRAINT check_status_not_null CHECK (status IS NOT NULL) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT check_status_not_null;4. Использование функций COALESCE в запросах
INSERT INTO orders (user_id, status)
VALUES (42, COALESCE(NULL, 'default_status')); Частые вопросы (FAQ)
Что вызывает ошибку 23502 not_null_violation?
Попытка записать явное значение NULL (или пропуск колонки, не имеющей значения DEFAULT) в столбец с ограничением NOT NULL.
Как добавить ограничение NOT NULL на таблицу размером в терабайт?
Создайте ограничение CHECK (column IS NOT NULL) NOT VALID, затем выполните ALTER TABLE ... VALIDATE CONSTRAINT. Это проверит данные без длительной эксклюзивной блокировки таблицы.
Как обрабатываются пустые строки и NULL в 1С:Предприятие?
В платформе 1С строковые реквизиты обычно хранятся как пустые строки '', а не NULL. Ошибка 23502 возникает при некорректной прямой записи через внешние источники данных.
Можно ли снять ограничение NOT NULL без блокировки?
Да, операция ALTER TABLE table_name ALTER COLUMN column_name DROP NOT NULL выполняется мгновенно и требует лишь кратковременной блокировки обновления метаданных.