Einige Datenbankverwaltungssysteme (DBMS) enthalten eine Funktion, die als generierte Spalten bezeichnet wird.
Generierte Spalten, die auch als „berechnete Spalten“ bezeichnet werden, ähneln einer normalen Spalte, mit der Ausnahme, dass der Wert einer generierten Spalte von einem Ausdruck abgeleitet wird, der Werte aus anderen Spalten berechnet.
Mit anderen Worten, der Wert einer generierten Spalte wird aus anderen Spalten berechnet.
Beispiel
Hier ist ein einfaches Beispiel, um zu demonstrieren, wie generierte Spalten funktionieren.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Dieses Beispiel wurde in SQLite erstellt und verwendet die SQLite-Syntax zum Erstellen einer generierten Spalte. Diese Syntax verwendet den GENERATED ALWAYS
Spaltenbeschränkung.
Der GENERATED ALWAYS
part ist in SQLite optional, also könnten Sie einfach AS
verwenden .
Eigentlich wird der GENERATED ALWAYS
part ist in MySQL ebenfalls optional und in TSQL (der SQL-Erweiterung für SQL Server) nicht einmal definiert, also AS
Schlüsselwort ist alles, was Sie brauchen (zusammen mit dem eigentlichen Ausdruck).
Der Ausdruck bestimmt den tatsächlichen Wert, den die Spalte enthalten wird. In meinem Beispiel der Teil, der (Qty * Price)
lautet ist der Ausdruck, der diesen Wert bestimmt.
In diesem Fall wird einfach die Menge (Anzahl jedes Produkts) mit dem Preis jedes Produkts multipliziert.
Daher enthält diese generierte Spalte den Gesamtwert jedes Bestands im Inventar.
Wenn wir Daten einfügen und auswählen, können wir den berechneten Wert der generierten Spalte sehen.
INSERT INTO Products VALUES
(1, 'Hammer', 10, 9.99),
(2, 'Saw', 5, 11.34),
(3, 'Wrench', 7, 37.00),
(4, 'Chisel', 9, 23.00),
(5, 'Bandage', 70, 120.00);
SELECT * FROM Products;
Ergebnis:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 10 9.99 99.9 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
Wenn wir uns die erste Reihe ansehen, sehen wir, dass es 10 Hämmer zum Preis von je 9,99 gibt. Die generierte Spalte multipliziert diese beiden Werte miteinander und wir erhalten 99,9.
Wenn wir die Anzahl der Hämmer reduzieren, würde die generierte Spalte einen anderen Wert ergeben.
Hier ist ein Beispiel.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Ergebnis:
Id Name Qty Price TotalValue ----- ---------- ----- ------ ---------- 1 Hammer 5 9.99 49.95 2 Saw 5 11.34 56.7 3 Wrench 7 37 259 4 Chisel 9 23 207 5 Bandage 70 120 8400
In diesem Fall habe ich die Anzahl der Hämmer auf 5 reduziert, und die generierte Spalte berechnet daher einen Wert von 49,95.
Arten von generierten Spalten
Es gibt zwei Arten von generierten Spalten; gespeichert und virtuell.
Einige DBMS verwenden möglicherweise eine etwas andere Terminologie, beispielsweise verwendet SQL Server den Begriff „persistent“ anstelle von „stored“. So oder so bezieht es sich auf dasselbe.
VIRTUAL
:Spaltenwerte werden nicht gespeichert, sondern beim Lesen von Zeilen ausgewertet.STORED
:Spaltenwerte werden ausgewertet und gespeichert, wenn Zeilen eingefügt oder aktualisiert werden.
STORED
Spalten benötigt daher Speicherplatz, wohingegen VIRTUAL
Spalten nicht.
Das bedeutet aber auch, dass VIRTUAL
Spalten verbrauchen beim Lesen mehr CPU-Zyklen.
Vorteile generierter Spalten
Generierte Spalten können beim Schreiben von Abfragen Zeit sparen, Fehler reduzieren und die Leistung verbessern.
Generierte Spalten können verwendet werden, um Abfragen zu vereinfachen und zu vereinheitlichen. Eine komplexe Bedingung kann als generierte Spalte definiert und dann von mehreren Abfragen in der Tabelle referenziert werden. Dadurch wird sichergestellt, dass sie alle genau die gleiche Bedingung verwenden.
Gespeicherte generierte Spalten können als materialisierter Cache für komplizierte Bedingungen verwendet werden, deren Berechnung im laufenden Betrieb kostspielig ist.
Einschränkungen von generierten Spalten
Generierte Spalten haben im Allgemeinen Einschränkungen im Vergleich zu normalen Spalten, obwohl das Ausmaß der Einschränkungen vom DBMS bestimmt werden kann.
Beispielsweise können generierte Spalten im Allgemeinen nur Werte aus Spalten innerhalb derselben Zeile berechnen. Diese Einschränkung kann jedoch (zumindest in SQL Server) überwunden werden, indem eine benutzerdefinierte Funktion als Teil des Ausdrucks der berechneten Spalte verwendet wird.
Sehen Sie sich die Links unten an, um mehr über die Implementierung von generierten Spalten in verschiedenen DBMSs zu erfahren.
Offizielle Dokumentation
Hier ist die Dokumentation für einige gängige DBMS, die die Einschränkungen ihrer Implementierung von generierten Spalten enthält:
- Berechnete Spalten in SQL Server
- Erzeugte Spalten in PostgreSQL (Version 12)
- Erzeugte Spalten in MySQL (Version 8.0)
- Erzeugte Spalten in SQLite