Upp till Postgres 11 genererade kolumner stöds inte - enligt definition i SQL-standarden och implementerad av vissa RDBMS inklusive DB2, MySQL och Oracle. Inte heller liknande "beräknade kolumner" av SQL Server.
STORED
genererade kolumner introduceras med Postgres 12 . Trivialt exempel:
CREATE TABLE tbl (
int1 int
, int2 int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);
db<>spela här
VIRTUAL
genererade kolumner kan komma med en av nästa iterationer. (Inte i Postgres 14 än).
Relaterat:
- Attributnotation för funktionsanrop ger fel
Tills dess , kan du emulera VIRTUAL
genererade kolumner med en funktion med attributnotation (tbl.col
) som ser ut och fungerar ungefär som en virtuellt genererad kolumn . Det är lite av en syntaxkonstighet som finns i Postgres av historiska skäl och som råkar passa fallet. Det här relaterade svaret har kodexempel :
- Lagra vanlig fråga som kolumn?
Uttrycket (som ser ut som en kolumn) ingår inte i en SELECT * FROM tbl
, fastän. Du måste alltid lista det explicit.
Kan även stödjas med ett matchande uttrycksindex - förutsatt att funktionen är IMMUTABLE
. Gilla:
CREATE FUNCTION col(tbl) ... AS ... -- your computed expression here
CREATE INDEX ON tbl(col(tbl));
Alternativ
Alternativt kan du implementera liknande funktionalitet med en VIEW
, valfritt i kombination med uttrycksindex. Sedan SELECT *
kan inkludera den genererade kolumnen.
"Bestående" (STORED
) beräknade kolumner kan implementeras med triggers på ett funktionellt identiskt sätt.
Materialiserade vyer är ett närbesläktat koncept, implementerat sedan Postgres 9.3.
I tidigare versioner kan man hantera MVs manuellt.