La prise en charge des colonnes générées a été ajoutée à SQLite dans la version 3.31.0, qui a été publiée le 22 janvier 2020.
Les colonnes générées et les colonnes calculées sont la même chose. Ce sont des colonnes dont les valeurs sont fonction des autres colonnes de la même ligne.
Dans SQLite, les colonnes générées sont créées en utilisant le GENERATED ALWAYS
contrainte de colonne lors de la création ou de la modification de la table.
Il existe deux types de colonne générée ; STORED
et VIRTUAL
. Uniquement VIRTUAL
des colonnes peuvent être ajoutées lors de la modification d'un tableau. Les deux types peuvent être ajoutés lors de la création d'un tableau.
Exemple
Voici un exemple pour illustrer.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);
Si vous obtenez l'erreur suivante :
Error: near "AS": syntax error
Il y a de fortes chances que vous deviez effectuer une mise à niveau vers une version ultérieure de SQLite. Les colonnes générées n'ont été introduites que dans SQLite 3.31.0.
Maintenant, insérons des données et sélectionnons-les.
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;
Résultat :
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
Ceci est un exemple simple et vous pouvez certainement utiliser des expressions plus complexes, par exemple, celles qui utilisent des fonctions intégrées.
Virtuel vs Stocké
Par défaut, la colonne calculée est créée en tant que VIRTUAL
colonne.
Vous avez également la possibilité de créer un STORED
colonne.
La valeur d'un VIRTUAL
colonne est calculée lors de la lecture, alors que la valeur d'un STORED
colonne est calculée lorsque la ligne est écrite.
Vous pouvez explicitement utiliser VIRTUAL
ou STORED
dans votre définition de colonne pour indiquer laquelle il doit s'agir. Si vous omettez ceci, alors ce sera VIRTUAL
.
Voici comment nous pouvons changer l'exemple précédent pour utiliser un STORED
colonne.
CREATE TABLE Products(
Id INTEGER PRIMARY KEY,
Name TEXT,
Qty INT,
Price INT,
TotalValue INT GENERATED ALWAYS AS (Qty * Price) STORED
);
Qu'il s'agisse d'un STORED
colonne ou VIRTUAL
, la saisie et la sélection des données sont exactement les mêmes.
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;
Résultat :
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
Mise à jour des données dans une colonne générée
Vous ne pouvez pas mettre à jour les données directement dans une colonne calculée. Autrement dit, vous ne pouvez pas écrire directement dans la colonne calculée elle-même.
Pour mettre à jour ses données, vous devez mettre à jour les données des colonnes sous-jacentes utilisées dans l'expression de la colonne calculée.
Voici un exemple de mise à jour des données utilisées dans les exemples précédents.
UPDATE Products
SET Qty = 5 WHERE Id = 1;
SELECT * FROM Products;
Résultat :
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
Dans ce cas, j'ai réduit le nombre de marteaux disponibles à 5. Cela a à son tour réduit la valeur totale des marteaux en stock et la valeur dans la colonne générée (TotalValue ) réduit de 99,99 à 49,95.