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

Qu'est-ce qu'une colonne générée ?

Certains systèmes de gestion de bases de données (SGBD) incluent une fonctionnalité appelée colonnes générées.

Également appelées « colonnes calculées », les colonnes générées sont similaires à une colonne normale, sauf que la valeur d'une colonne générée est dérivée d'une expression qui calcule les valeurs d'autres colonnes.

En d'autres termes, la valeur d'une colonne générée est calculée à partir d'autres colonnes.

Exemple

Voici un exemple de base pour montrer comment fonctionnent les colonnes générées.

CREATE TABLE Products( 
    Id INTEGER PRIMARY KEY, 
    Name TEXT,
    Qty INT,
    Price INT,
    TotalValue INT GENERATED ALWAYS AS (Qty * Price)
);

Cet exemple a été créé dans SQLite et utilise la syntaxe SQLite pour créer une colonne générée. Cette syntaxe utilise le GENERATED ALWAYS colonne-contrainte.

Le GENERATED ALWAYS la partie est facultative dans SQLite, vous pouvez donc simplement utiliser AS .

En fait, le GENERATED ALWAYS part est également facultative dans MySQL, et elle n'est même pas définie dans TSQL (l'extension SQL pour SQL Server), donc le AS le mot-clé est tout ce dont vous avez besoin (avec l'expression réelle).

L'expression est ce qui détermine la valeur réelle que la colonne contiendra. Dans mon exemple, la partie qui lit (Qty * Price) est l'expression qui détermine cette valeur.

Dans ce cas, il s'agit simplement de multiplier la quantité (nombre de chaque produit) par le prix de chaque produit.

Par conséquent, cette colonne générée contient la valeur totale de chaque stock dans l'inventaire.

Si nous insérons des données et les sélectionnons, nous pouvons voir la valeur calculée de la colonne générée.

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      

Si nous regardons la première rangée, nous pouvons voir qu'il y a 10 marteaux au prix de 9,99 chacun. La colonne générée multiplie ces deux valeurs ensemble et nous nous retrouvons avec 99,9.

Si nous réduisons le nombre de marteaux, la colonne générée produirait une valeur différente.

Voici un exemple.

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 à 5, et la colonne générée a donc calculé une valeur de 49,95.

Types de colonnes générées

Il existe deux types de colonnes générées ; stockées et virtuelles.

Certains SGBD peuvent utiliser une terminologie légèrement différente, par exemple SQL Server utilise le terme « persistant » au lieu de « stocké ». Dans tous les cas, cela fait référence à la même chose.

  • VIRTUAL  :Les valeurs des colonnes ne sont pas stockées, mais sont évaluées lorsque les lignes sont lues.
  • STORED  :les valeurs des colonnes sont évaluées et stockées lorsque les lignes sont insérées ou mises à jour.

STORED les colonnes nécessitent donc de l'espace de stockage, alors que VIRTUAL les colonnes ne le font pas.

Cependant, cela signifie également que VIRTUAL les colonnes utilisent plus de cycles CPU lors de leur lecture.

Avantages des colonnes générées

Les colonnes générées permettent de gagner du temps lors de la rédaction de requêtes, de réduire les erreurs et d'améliorer les performances.

Les colonnes générées peuvent être utilisées pour simplifier et unifier les requêtes. Une condition complexe peut être définie comme une colonne générée, puis référencée à partir de plusieurs requêtes sur la table. Cela permet de s'assurer qu'ils utilisent tous exactement la même condition.

Les colonnes générées stockées peuvent être utilisées comme cache matérialisé pour des conditions compliquées qui sont coûteuses à calculer à la volée.

Limites des colonnes générées

Les colonnes générées présentent généralement des limitations par rapport aux colonnes normales, bien que l'étendue des limitations puisse être déterminée par le SGBD.

Par exemple, les colonnes générées ne peuvent généralement calculer que des valeurs à partir de colonnes d'une même ligne. Cependant, cette limitation peut être surmontée (au moins dans SQL Server) en utilisant une fonction définie par l'utilisateur dans le cadre de l'expression de la colonne calculée.

Consultez les liens ci-dessous pour en savoir plus sur la mise en œuvre des colonnes générées dans divers SGBD.

Documentation officielle

Voici la documentation de certains SGBD populaires qui inclut les limitations de leur implémentation des colonnes générées :

  • Colonnes calculées dans SQL Server
  • Colonnes générées dans PostgreSQL (Version 12)
  • Colonnes générées dans MySQL (version 8.0)
  • Colonnes générées dans SQLite