SQLite
 sql >> Base de données >  >> RDS >> SQLite

Comment créer une colonne calculée dans SQLite

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.