Генерируемый столбец — это специальный столбец, значение которого всегда вычисляется на основе значений других столбцов. Таким образом, он является для столбцов тем же, чем представление является для таблиц. Существует два вида генерируемых столбцов: хранимые и виртуальные. Хранимый генерируемый столбец вычисляется при записи данных (вставке или обновлении) и занимает место в хранилище так же, как и обычный столбец. Виртуальный генерируемый столбец не занимает места на диске и вычисляется непосредственно при чтении. Таким образом, виртуальный генерируемый столбец аналогичен обычному представлению, а хранимый — материализованному представлению (за исключением того, что он всегда обновляется автоматически). Digital Q.DataBase в настоящее время реализована поддержка только хранимых генерируемых столбцов.
Для создания генерируемого столбца используйте конструкцию GENERATED ALWAYS
AS в CREATE TABLE, например:
CREATE TABLE people (
...,
height_cm numeric,
height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);
Ключевое слово STORED необходимо указать для выбора хранимого типа генерируемого столбца. См. CREATE TABLE для получения дополнительных сведений.
В генерируемый столбец нельзя производить запись напрямую. В
INSERT или UPDATE командах нельзя указывать значение для генерируемого столбца, однако ключевое слово
DEFAULT может быть указано.
Рассмотрим различия между столбцом со значением по умолчанию и генерируемым столбцом. Значение по умолчанию вычисляется один раз при первой вставке строки, если не было указано иное значение; генерируемый столбец обновляется при любом изменении строки, и это поведение нельзя переопределить. Значение по умолчанию не может ссылаться на другие столбцы таблицы; выражение генерации, как правило, ссылается на них. Значение по умолчанию может использовать волатильные функции, например
random() или функции, обращающиеся к текущему времени; это не допускается для генерируемых столбцов.
К определению генерируемых столбцов и таблиц, содержащих их, применяется ряд ограничений:
В выражении генерации можно использовать только постоянные (immutable) функции; оно не может содержать подзапросы или ссылаться на что-либо, кроме текущей строки.
Выражение генерации не может ссылаться на другой генерируемый столбец.
Выражение генерации не может ссылаться на системный столбец, за исключением
tableoid.
Для генерируемого столбца нельзя задать значение по умолчанию или определение идентичности (identity).
Генерируемый столбец не может входить в ключ секционирования.
Сторонние таблицы могут содержать генерируемые столбцы. Подробнее см. CREATE FOREIGN TABLE для получения дополнительных сведений.
Для механизмов наследования и секционирования:
Если столбец родительской таблицы является генерируемым, то соответствующий дочерний столбец также должен быть генерируемым; при этом для дочернего столбца может быть указано другое выражение генерации. Выражение генерации, фактически применяемое при вставке или обновлении строки, определяется таблицей, в которой эта строка размещена физически. (Это отличается от поведения значений по умолчанию: для них используется значение по умолчанию, связанное с той таблицей, имя которой указано в запросе.)
Если столбец родительского элемента не является генерируемым, то его дочерний столбец также не должен быть генерируемым.
Для наследуемых таблиц: если определение дочернего столбца не содержит
ключевого слова GENERATED в CREATE TABLE
... INHERITS, то его GENERATED предложение
будет автоматически скопировано из родительского элемента. ALTER TABLE
... INHERIT будет требовать, чтобы родительский и дочерний столбцы
уже соответствовали друг другу по статусу генерации, но при этом не требуется соответствие их
выражений генерации.
Аналогично для секционированных таблиц: если определение дочернего столбца
не содержит параметров GENERATED предложение
в CREATE TABLE ... выражение PARTITION OF, то
его GENERATED предложение будет автоматически скопировано
из родительского элемента. ALTER TABLE ... ATTACH PARTITION
будет требовать, чтобы столбцы родительского и дочернего элементов уже соответствовали друг другу по
статусу генерации, но при этом не потребует, чтобы их
выражения генерации совпадали.
В случае множественного наследования, если один родительский столбец является генерируемым столбцом, то все родительские столбцы должны быть генерируемыми столбцами. Если они не имеют одинакового выражения генерации, то необходимое выражение для дочернего элемента должно быть указано явно.
При использовании генерируемых столбцов действуют дополнительные правила.
Привилегии доступа для генерируемых столбцов управляются отдельно от привилегий их базовых столбцов. Таким образом, можно настроить права доступа так, чтобы определенная роль могла считывать данные из генерируемого столбца, но не из базовых столбцов.
Концептуально, генерируемые столбцы обновляются после триггеров
BEFORE триггеры уже сработали. Таким образом, изменения, внесенные в базовые столбцы в BEFORE триггере, будут отражены в генерируемых столбцах. Но и наоборот, не допускается обращение к генерируемым столбцам в BEFORE Триггеры.
Генерируемые столбцы пропускаются при логической репликации и не могут быть указаны в CREATE PUBLICATION списке столбцов.