Сгенерированный столбец — это специальный столбец, который всегда вычисляется из других столбцов. Таким образом, для столбцов это то же самое, что представление для таблиц. Существует два типа генерируемых столбцов: хранимые и виртуальные. Сохраненный сгенерированный столбец вычисляется при его записи (вставке или обновлении) и занимает память, как если бы это был обычный столбец. Виртуальный сгенерированный столбец не занимает памяти и вычисляется при чтении. Таким образом, виртуальный сгенерированный столбец похож на представление, а сохраненный сгенерированный столбец похож на материализованное представление (за исключением того, что он всегда обновляется автоматически). В настоящее время 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
триггерах запрещен.
0 комментариев