Bis zu Postgres 11 generierte Spalten werden nicht unterstützt - wie im SQL-Standard definiert und von einigen RDBMS implementiert, einschließlich DB2, MySQL und Oracle. Auch nicht die ähnlichen "berechneten Spalten" von SQL Server.
STORED
generierte Spalten werden mit Postgres 12 eingeführt . Triviales Beispiel:
CREATE TABLE tbl (
int1 int
, int2 int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);
db<>hier fummeln
VIRTUAL
generierte Spalten können mit einer der nächsten Iterationen kommen. (Noch nicht in Postgres 14).
Verwandte:
- Attributschreibweise für Funktionsaufruf gibt Fehler
Bis dahin , können Sie VIRTUAL
emulieren generierte Spalten mit einer Funktion unter Verwendung der Attributschreibweise (tbl.col
), die ähnlich wie eine virtuell generierte Spalte aussieht und funktioniert . Das ist eine kleine Syntaxkuriosität, die in Postgres aus historischen Gründen existiert und zufällig in den Fall passt. Diese verwandte Antwort enthält Codebeispiele :
- Allgemeine Abfrage als Spalte speichern?
Der Ausdruck (der wie eine Spalte aussieht) ist nicht in einem SELECT * FROM tbl
enthalten , obwohl. Sie müssen es immer explizit angeben.
Kann auch mit einem passenden Ausdrucksindex unterstützt werden - vorausgesetzt, die Funktion ist IMMUTABLE
. Wie:
CREATE FUNCTION col(tbl) ... AS ... -- your computed expression here
CREATE INDEX ON tbl(col(tbl));
Alternativen
Alternativ können Sie eine ähnliche Funktionalität mit einer VIEW
implementieren , optional gekoppelt mit Ausdrucksindizes. Dann SELECT *
kann die generierte Spalte enthalten.
"Bestanden" (STORED
) berechnete Spalten können auf funktional identische Weise mit Triggern implementiert werden.
Materialisierte Ansichten sind ein eng verwandtes Konzept, das seit Postgres 9.3 implementiert ist.
In früheren Versionen kann man MVs manuell verwalten.