До 11 генерирани колони от Postgres не се поддържат - както е дефинирано в SQL стандарта и се изпълнява от някои RDBMS, включително DB2, MySQL и Oracle. Нито подобните „изчислени колони“ на SQL Server.
STORED
генерираните колони се въвеждат с Postgres 12 . Тривиален пример:
CREATE TABLE tbl (
int1 int
, int2 int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);
db<>цигулка тук
VIRTUAL
генерираните колони може да идват с една от следващите итерации. (все още не е в Postgres 14).
Свързано:
- Атрибутната нотация за извикване на функция дава грешка
Дотогава , можете да емулирате VIRTUAL
генерирани колони сфункция използвайки нотация на атрибут (tbl.col
), който изглежда и работи много като виртуална генерирана колона . Това е малко синтактична странност, която съществува в Postgres по исторически причини и се случва да пасва на случая. Този свързан отговор има примери за код :
- Да се съхранява обща заявка като колона?
Изразът (приличащ на колона) не е включен в SELECT * FROM tbl
, все пак. Винаги трябва да го изброявате изрично.
Може да се поддържа и със съвпадащ индекс на израза - при условие, че функцията е IMMUTABLE
. Като:
CREATE FUNCTION col(tbl) ... AS ... -- your computed expression here
CREATE INDEX ON tbl(col(tbl));
Алтернативи
Като алтернатива можете да приложите подобна функционалност с VIEW
, по избор съчетано с индекси на изрази. След това SELECT *
може да включва генерираната колона.
„Устойчиво“ (STORED
) изчислените колони могат да бъдат реализирани с тригери по функционално идентичен начин.
Материализираните изгледи са тясно свързана концепция, внедрена от Postgres 9.3.
В по-ранни версии човек може да управлява MV ръчно.