SQLite
 sql >> Datenbank >  >> RDS >> SQLite

So erstellen Sie eine berechnete Spalte in SQLite

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.