Сгенерированный столбец — это специальный столбец, который всегда вычисляется из других столбцов. Таким образом, для столбцов это то же самое, что представление для таблиц. Существует два типа генерируемых столбцов: хранимые и виртуальные. Сохраненный сгенерированный столбец вычисляется при его записи (вставке или обновлении) и занимает память, как если бы это был обычный столбец. Виртуальный сгенерированный столбец не занимает памяти и вычисляется при чтении. Таким образом, виртуальный сгенерированный столбец похож на представление, а сохраненный сгенерированный столбец похож на материализованное представление (за исключением того, что он всегда обновляется автоматически). В настоящее время PostgreSQL реализует только сохраненные сгенерированные столбцы.

Чтобы создать сгенерированный столбец, используйте GENERATED ALWAYS ASпредложение в CREATE TABLE, например:

CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED
);

Ключевое слово STOREDдолжно быть указано, чтобы выбрать сохраненный вид сгенерированного столбца. 

Сгенерированный столбец не может быть записан напрямую. В командах INSERTили UPDATEнельзя указать значение для сгенерированного столбца, но DEFAULTможно указать ключевое слово.

Рассмотрим различия между столбцом со значением по умолчанию и сгенерированным столбцом. Значение столбца по умолчанию оценивается один раз при первой вставке строки, если не было указано другое значение; сгенерированный столбец обновляется при каждом изменении строки и не может быть переопределен. Столбец по умолчанию не может ссылаться на другие столбцы таблицы; выражение генерации обычно делает это. Столбец по умолчанию может использовать изменчивые функции, например, random()или функции, относящиеся к текущему времени; это не разрешено для сгенерированных столбцов.

Несколько ограничений применяются к определению сгенерированных столбцов и таблиц, включающих сгенерированные столбцы:

  • Выражение генерации может использовать только неизменяемые функции и не может использовать подзапросы или каким-либо образом ссылаться на что-либо, кроме текущей строки.
  • Выражение генерации не может ссылаться на другой сгенерированный столбец.
  • Выражение генерации не может ссылаться на системный столбец, за исключением tableoid.
  • Сгенерированный столбец не может иметь столбец по умолчанию или определение удостоверения.
  • Сгенерированный столбец не может быть частью ключа секции.
  • Внешние таблицы могут иметь сгенерированные столбцы. Подробности см. в разделе CREATE FOREIGN TABLE .
  • Для наследования:
    • Если родительский столбец является сгенерированным столбцом, дочерний столбец также должен быть сгенерированным столбцом с использованием того же выражения. В определении дочернего столбца пропустите GENERATEDпредложение, так как оно будет скопировано из родительского.
    • В случае множественного наследования, если один родительский столбец является сгенерированным столбцом, то все родительские столбцы должны быть сгенерированными столбцами и с одним и тем же выражением.
    • Если родительский столбец не является сгенерированным столбцом, дочерний столбец может быть определен как сгенерированный или нет.

Дополнительные соображения относятся к использованию сгенерированных столбцов.

  • Сгенерированные столбцы поддерживают права доступа отдельно от базовых столбцов. Таким образом, можно устроить так, чтобы конкретная роль могла читать из сгенерированного столбца, но не из базовых базовых столбцов.
  • Сгенерированные столбцы концептуально обновляются после BEFOREзапуска триггеров. Поэтому изменения, внесенные в базовые столбцы в BEFOREтриггере, будут отражены в сгенерированных столбцах. Но, наоборот, доступ к сгенерированным столбцам в BEFOREтриггерах запрещен.