Pull to refresh

Virtual generated columns в PostgreSQL 18

Reading time1 min
Views2.3K

В 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

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 6: ↑5 and ↓1+5
Comments14

Articles