SQLite
 sql >> Database >  >> RDS >> SQLite

Come creare una colonna calcolata in SQLite

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.