Virtual generated columns в PostgreSQL 18

607a13cb687dcce685d28a26dff81108

В PostgreSQL 18 добавят виртуальные сгенерированные столбцы (комит).


Ранее PostgreSQL уже поддерживал сгенерированные столбцы (начиная с версии 12), но только в варианте STORED, когда результат вычислений сохраняется в таблице. Теперь появилась возможность вычислять значения «на лету» при чтении, что экономит место и даёт больше гибкости в проектировании схем данных.


Как создать виртуальный столбец?


Синтаксис очень похож на STORED-столбцы, но с добавлением VIRTUAL (или просто без указания типа хранения, так как VIRTUAL теперь — поведение по умолчанию):


CREATE TABLE t (
    a INT,
    b INT
);

INSERT INTO t VALUES (1, 99);

ALTER TABLE t ADD COLUMN c INT GENERATED ALWAYS AS (a + b) STORED;
ALTER TABLE t ADD COLUMN d INT GENERATED ALWAYS AS (a - b) VIRTUAL;

так выглядят данные:


SELECT * FROM t;

a |  b  |  c  |  d  
---+----+-----+-----
 1 | 99 | 100 | -98

В этом примере:


c (STORED) хранится в таблице и не пересчитывается при каждом запросе.
d (VIRTUAL) вычисляется динамически при каждом запросе.


Ограничения виртуальных столбцов


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


  • Нельзя индексировать.
  • Нельзя использовать в UNIQUE и FOREIGN KEY.
  • Нельзя объявить NOT NULL, но можно использовать CHECK.
  • Нельзя использовать в логической репликации.
  • Нельзя изменять выражение (ALTER TABLE… DROP EXPRESSION).
  • Нельзя использовать в качестве столбца с типом DOMAIN.

Некоторые из этих ограничений могут быть сняты в будущих версиях PostgreSQL.


Приглашаю вас подписаться на мой канал в telegram

© Habrahabr.ru