Ошибка PostgreSQL 42611: invalid_column_definition — определение колонок
- Ошибка DDL
ERROR: invalid column definition: ... (SQLSTATE 42611)при создании или модификации таблицы. - Сбои при создании вычисляемых столбцов (
GENERATED ALWAYS AS ... STORED). - Попытка совместить несовместимые атрибуты колонки (например, одновременное указание
DEFAULTиGENERATED). - Отказ реструктуризации таблиц при обновлении конфигурации 1С:Предприятие.
1. Исправление конфликта DEFAULT и GENERATED колонок
Вычисляемые колонки не могут иметь значение по умолчанию (DEFAULT):
-- Ошибочное определение:
CREATE TABLE orders (
price numeric,
qty int,
total numeric DEFAULT 0 GENERATED ALWAYS AS (price * qty) STORED -- Ошибка 42611
);
-- Исправленное определение:
CREATE TABLE orders (
price numeric NOT NULL,
qty int NOT NULL,
total numeric GENERATED ALWAYS AS (price * qty) STORED
);2. Проверка ограничений на функции в вычисляемых колонках
Выражение в GENERATED ALWAYS AS обязано быть строго IMMUTABLE (запрещено использовать now(), random(), подобычные подзапросы или внешние таблицы):
-- Неверно:
created_date date GENERATED ALWAYS AS (now()::date) STORED -- Ошибка 42611 / 42P17
-- Корректно:
created_date date DEFAULT CURRENT_DATE;3. Модификация типа колонки в таблицах 1С через ALTER TABLE
ALTER TABLE _document123 ALTER COLUMN _number TYPE varchar(30); Частые вопросы (FAQ)
Поддерживает ли PostgreSQL виртуальные (VIRTUAL) вычисляемые колонки?
До версии PostgreSQL 16 включительно поддерживаются только материализованные вычисляемые колонки (STORED). Начиная с PostgreSQL 17, добавлена поддержка VIRTUAL колонок.
Можно ли создать первичный ключ (PRIMARY KEY) поверх вычисляемой колонки?
Да, если вычисляемая колонка объявлена со спецификатором STORED и детерминированным (IMMUTABLE) выражением.
Почему 1С не использует механизм GENERATED ALWAYS колонок?
Платформа 1С:Предприятие реализует расчет и валидацию реквизитов на уровне своего сервера приложений (rphost), сохраняя в СУБД уже готовые материализованные значения.
Можно ли ссылаться на другую вычисляемую колонку внутри выражения GENERATED?
Нет, стандарт PostgreSQL запрещает цепочки зависимостей между вычисляемыми колонками в рамках одной таблицы.