Генерируемые столбцы
Генерируемый столбец — это специальный столбец, который всегда вычисляется из других столбцов. Таким образом, для столбцов это то же самое, что представление для таблиц. Существует два вида генерируемых столбцов: хранимые и виртуальные. Хранимый генерируемый столбец вычисляется, когда он записывается (вставляется или изменяется) и занимает пространство в хранилище, как если бы это был обычный столбец. Виртуальный генерируемый столбец не занимает места в хранилище и вычисляется при чтении. Таким образом, виртуальный генерируемый столбец похож на представление, а хранимый — на материализованное представление (за исключением того, что он всегда обновляется автоматически). В настоящее время QHB реализует только хранимые генерируемые столбцы.
Чтобы создать генерируемый столбец, используйте предложение 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(), или функции, относящиеся к текущему времени; для генерируемых столбцов это не допускается.
К определению генерируемых столбцов и таблиц, имеющих генерируемые столбцы, применяется несколько ограничений:
-
В генерирующем выражении могут вызываться только постоянные функции и никак не могут использоваться подзапросы или ссылки на что-либо, кроме текущей строки.
-
Генерирующее выражение не может ссылаться на другой генерируемый столбец.
-
Генерирующее выражение не может ссылаться на системный столбец, за исключением tableoid.
-
Генерируемый столбец не может иметь значение по умолчанию или определение идентификации.
-
Генерируемый столбец не может быть частью ключа партиционирования.
-
Сторонние таблицы могут иметь генерируемые столбцы. Подробную информацию см. на справочной странице команды CREATE FOREIGN TABLE.
-
Применительно к наследованию и партиционированию:
-
Если родительский столбец является генерируемым, его дочерний столбец тоже должен быть генерируемым; однако дочерний столбец может иметь другое генерирующее выражение. Генерирующее выражение, которое фактически применяется при добавлении или изменении строки, связано с таблицей, в которой физически находится строка. (Это отличается от поведения для столбцов со значением по умолчанию: для них применяется значение по умолчанию, связанное с таблицей, указанной в запросе.)
-
Если родительский столбец не является генерируемым, его дочерний столбец тоже не должен быть генерируемым.
-
Для унаследованных таблиц, если определение дочернего столбца в команде
CREATE TABLE ... INHERITSнаписано без предложения GENERATED, то его предложение GENERATED будет автоматически копироваться из родителя. КомандаALTER TABLE ... INHERITбудет требовать, чтобы родительский и дочерний столбцы уже совпадали в отношении статуса генерации, но не будет требовать совпадения их генерирующих выражений. -
Аналогично для партиционированных таблиц, если определение дочернего столбца в команде
CREATE TABLE ... PARTITION OFнаписано без предложения GENERATED, то его предложение GENERATED будет автоматически копироваться из родителя. КомандаALTER TABLE ... ATTACH PARTITIONбудет требовать, чтобы родительский и дочерний столбцы уже совпадали в отношении статуса генерации, но не будет требовать совпадения их генерирующих выражений. -
В случае множественного наследования, если один родительский столбец является генерируемым, то все остальные родительские столбцы тоже должны быть генерируемыми. Если их генерирующее выражение не одинаковое, то желаемое выражение для потомка должно быть указано явно.
-
Дополнительные особенности относятся к использованию генерируемых столбцов.
-
Права доступа генерируемых столбцов существуют отдельно от прав нижележащих базовых столбцов. Таким образом, можно расположить их так, чтобы определенная роль могла читать данные из генерируемого столбца, но не из нижележащих базовых столбцов.
-
Согласно концепции, генерируемые столбцы обновляются после запуска триггеров BEFORE. Поэтому изменения, внесенные в базовые столбцы в триггере BEFORE, будут отражены в генерируемых столбцах. Однако обращение к генерируемым столбцам в триггерах BEFORE, наоборот, запрещено.
-
Генерируемые столбцы пропускаются при логической репликации и не могут быть указаны в списке столбцов команды
CREATE PUBLICATION.