Il supporto delle colonne generate è stato aggiunto a SQLite nella versione 3.31.0, rilasciata il 22 gennaio 2020.
Le colonne generate e le colonne calcolate sono la stessa cosa. Sono colonne i cui valori sono una funzione di altre colonne nella stessa riga.
In SQLite, le colonne generate vengono create utilizzando GENERATED ALWAYS
vincolo di colonna durante la creazione o la modifica della tabella.
Esistono due tipi di colonna generata; STORED
e VIRTUAL
. Solo VIRTUAL
le colonne possono essere aggiunte quando si modifica una tabella. Entrambi i tipi possono essere aggiunti durante la creazione di una tabella.
Esempio
Ecco un esempio da dimostrare.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Se ricevi il seguente errore:
Error: near "AS": syntax error
È probabile che sia necessario eseguire l'aggiornamento a una versione successiva di SQLite. Le colonne generate sono state introdotte solo in SQLite 3.31.0.
Ora inseriamo i dati e li selezioniamo.
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;
Risultato:
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
Questo è un semplice esempio e puoi sicuramente utilizzare espressioni più complesse, ad esempio quelle che utilizzano funzioni integrate.
Virtuale vs Archiviato
Per impostazione predefinita, la colonna calcolata viene creata come VIRTUAL
colonna.
Hai anche la possibilità di creare un STORED
colonna.
Il valore di un VIRTUAL
la colonna viene calcolata durante la lettura, mentre il valore di un STORED
colonna viene calcolata quando la riga viene scritta.
Puoi usare esplicitamente VIRTUAL
o STORED
nella definizione della colonna per indicare quale dovrebbe essere. Se lo ometti, sarà VIRTUAL
.
Ecco come possiamo modificare l'esempio precedente per utilizzare un STORED
colonna.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Indipendentemente dal fatto che si tratti di un STORED
colonna o VIRTUAL
, l'inserimento e la selezione dei dati è esattamente lo stesso.
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;
Risultato:
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
Aggiornamento dei dati in una colonna generata
Non puoi aggiornare i dati direttamente in una colonna calcolata. Cioè, non puoi scrivere direttamente nella colonna calcolata stessa.
Per aggiornare i suoi dati, devi aggiornare i dati nelle colonne sottostanti utilizzate nell'espressione della colonna calcolata.
Ecco un esempio di aggiornamento dei dati utilizzati negli esempi precedenti.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Risultato:
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 questo caso ho ridotto il numero di martelli disponibili a 5. Questo a sua volta ha ridotto il valore totale dei martelli in stock e il valore nella colonna generata (TotalValue ) ridotto da 99,99 a 49,95.