Unterstützung für generierte Spalten wurde SQLite in Version 3.31.0 hinzugefügt, die am 22. Januar 2020 veröffentlicht wurde.
Generierte Spalten und berechnete Spalten sind dasselbe. Sie sind Spalten, deren Werte eine Funktion anderer Spalten in derselben Zeile sind.
In SQLite werden generierte Spalten mit dem GENERATED ALWAYS
erstellt Spaltenbeschränkung beim Erstellen oder Ändern der Tabelle.
Es gibt zwei Arten von generierten Spalten; STORED
und VIRTUAL
. Nur VIRTUAL
Spalten können hinzugefügt werden, wenn eine Tabelle geändert wird. Beide Typen können beim Erstellen einer Tabelle hinzugefügt werden.
Beispiel
Hier ist ein Beispiel zur Veranschaulichung.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Wenn Sie die folgende Fehlermeldung erhalten:
Error: near "AS": syntax error
Wahrscheinlich müssen Sie auf eine neuere Version von SQLite aktualisieren. Generierte Spalten wurden erst in SQLite 3.31.0 eingeführt.
Lassen Sie uns nun Daten einfügen und auswählen.
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
Dies ist ein einfaches Beispiel und Sie können sicherlich komplexere Ausdrücke verwenden, zum Beispiel solche, die eingebaute Funktionen verwenden.
Virtuell vs. Gespeichert
Standardmäßig wird die berechnete Spalte als VIRTUAL
erstellt Säule.
Sie haben auch die Möglichkeit, einen STORED
zu erstellen Spalte.
Der Wert eines VIRTUAL
Spalte wird beim Lesen berechnet, während der Wert einer STORED
Spalte wird berechnet, wenn die Zeile geschrieben wird.
Sie können explizit VIRTUAL
verwenden oder STORED
in Ihrer Spaltendefinition, um anzugeben, welche es sein soll. Wenn Sie dies weglassen, wird es VIRTUAL
sein .
So können wir das vorherige Beispiel ändern, um einen STORED
zu verwenden Spalte.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Unabhängig davon, ob es sich um einen STORED
handelt Spalte oder VIRTUAL
, die Eingabe und Auswahl der Daten ist genau gleich.
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
Aktualisieren von Daten in einer generierten Spalte
Sie können Daten nicht direkt in einer berechneten Spalte aktualisieren. Das heißt, Sie können nicht direkt in die berechnete Spalte selbst schreiben.
Um ihre Daten zu aktualisieren, müssen Sie die Daten in den zugrunde liegenden Spalten aktualisieren, die im Ausdruck der berechneten Spalte verwendet werden.
Hier ist ein Beispiel für die Aktualisierung der in den vorherigen Beispielen verwendeten Daten.
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 verfügbaren Hämmer auf 5 reduziert. Dies wiederum reduzierte den Gesamtwert der Hämmer auf Lager und den Wert in der generierten Spalte (TotalValue ) von 99,99 auf 49,95 reduziert.