Alcuni sistemi di gestione dei database (DBMS) includono una funzionalità denominata colonne generate.
Conosciute anche come "colonne calcolate", le colonne generate sono simili a una colonna normale, tranne per il fatto che il valore di una colonna generata deriva da un'espressione che calcola i valori da altre colonne.
In altre parole, il valore di una colonna generata viene calcolato da altre colonne.
Esempio
Ecco un esempio di base per dimostrare come funzionano le colonne generate.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Questo esempio è stato creato in SQLite e utilizza la sintassi SQLite per creare una colonna generata. Questa sintassi utilizza il GENERATED ALWAYS
vincolo di colonna.
Il GENERATED ALWAYS
la parte è facoltativa in SQLite, quindi puoi semplicemente usare AS
.
In realtà, il GENERATED ALWAYS
parte è facoltativa anche in MySQL e non è nemmeno definita in TSQL (l'estensione SQL per SQL Server), quindi AS
la parola chiave è tutto ciò di cui hai bisogno (insieme all'espressione effettiva).
L'espressione è ciò che determina il valore effettivo che conterrà la colonna. Nel mio esempio, la parte che legge (Qty * Price)
è l'espressione che determina quel valore.
In questo caso, si tratta semplicemente di moltiplicare la quantità (numero di ogni prodotto) per il prezzo di ogni prodotto.
Pertanto questa colonna generata contiene il valore totale di ogni azione nell'inventario.
Se inseriamo i dati e li selezioniamo, possiamo vedere il valore calcolato della colonna generata.
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
Se guardiamo la prima riga, possiamo vedere che ci sono 10 martelli al prezzo di 9,99 ciascuno. La colonna generata moltiplica questi due valori insieme e si ottiene 99,9.
Se riduciamo il numero di martelli, la colonna generata produrrebbe un valore diverso.
Ecco un esempio.
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 a 5 e la colonna generata ha quindi calcolato un valore di 49,95.
Tipi di colonne generate
Esistono due tipi di colonne generate; memorizzato e virtuale.
Alcuni DBMS potrebbero utilizzare una terminologia leggermente diversa, ad esempio SQL Server utilizza il termine "persistente" anziché "archiviato". In ogni caso, si riferisce alla stessa cosa.
VIRTUAL
:i valori delle colonne non vengono memorizzati, ma valutati durante la lettura delle righe.STORED
:i valori delle colonne vengono valutati e archiviati quando le righe vengono inserite o aggiornate.
STORED
colonne richiede quindi spazio di archiviazione, mentre VIRTUAL
le colonne no.
Tuttavia, questo significa anche che VIRTUAL
le colonne utilizzano più cicli della CPU durante la lettura.
Vantaggi delle colonne generate
Le colonne generate possono far risparmiare tempo durante la scrittura di query, ridurre gli errori e migliorare le prestazioni.
Le colonne generate possono essere utilizzate per semplificare e unificare le query. Una condizione complessa può essere definita come una colonna generata e quindi indicata da più query sulla tabella. Questo aiuta a garantire che tutti utilizzino esattamente la stessa condizione.
Le colonne generate archiviate possono essere utilizzate come cache materializzata per condizioni complicate che sono costose da calcolare al volo.
Limiti delle colonne generate
Le colonne generate generalmente presentano limitazioni rispetto alle colonne normali, sebbene l'entità delle limitazioni possa essere determinata dal DBMS.
Ad esempio, le colonne generate generalmente sono in grado di calcolare i valori solo dalle colonne all'interno della stessa riga. Tuttavia, questa limitazione può essere superata (almeno in SQL Server) utilizzando una funzione definita dall'utente come parte dell'espressione della colonna calcolata.
Consulta i link sottostanti per saperne di più sull'implementazione delle colonne generate in vari DBMS.
Documentazione ufficiale
Ecco la documentazione per alcuni DBMS popolari che include i limiti della loro implementazione delle colonne generate:
- Colonne calcolate in SQL Server
- Colonne generate in PostgreSQL (versione 12)
- Colonne generate in MySQL (versione 8.0)
- Colonne generate in SQLite