Fino a Postgres 11 colonne generate non sono supportati, come definito nello standard SQL e implementato da alcuni RDBMS inclusi DB2, MySQL e Oracle. Né le simili "colonne calcolate" di SQL Server.
STORED
le colonne generate vengono introdotte con Postgres 12 . Esempio banale:
CREATE TABLE tbl (
int1 int
, int2 int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);
db<>gioca qui
VIRTUAL
le colonne generate possono venire con una delle successive iterazioni. (Non ancora in Postgres 14).
Correlati:
- La notazione dell'attributo per la chiamata di funzione dà errore
Fino ad allora , puoi emulare VIRTUAL
colonne generate con una funzione utilizzando la notazione degli attributi (tbl.col
) che sembra e funziona in modo molto simile a una colonna generata virtuale . Questa è una sorta di stranezza sintattica che esiste in Postgres per ragioni storiche e si adatta al caso. Questa risposta correlata contiene esempi di codice :
- Memorizza query comune come colonna?
L'espressione (che assomiglia a una colonna) non è inclusa in un SELECT * FROM tbl
, anche se. Devi sempre elencarlo in modo esplicito.
Può anche essere supportato con un indice di espressione corrispondente, a condizione che la funzione sia IMMUTABLE
. Come:
CREATE FUNCTION col(tbl) ... AS ... -- your computed expression here
CREATE INDEX ON tbl(col(tbl));
Alternative
In alternativa, puoi implementare funzionalità simili con un VIEW
, facoltativamente accoppiato con indici di espressione. Quindi SELECT *
può includere la colonna generata.
"Persistito" (STORED
) le colonne calcolate possono essere implementate con trigger in modo funzionalmente identico.
Le viste materializzate sono un concetto strettamente correlato, implementato da Postgres 9.3.
Nelle versioni precedenti è possibile gestire manualmente le MV.