Ajouter des colonnes de tableaux à une table existante
Dans cette étape, vous apprendrez à ajouter et à manipuler des colonnes de tableaux (array columns) dans PostgreSQL. Nous allons étendre notre table products existante en ajoutant une colonne de tableau pour stocker des tags. Les colonnes de tableaux vous permettent de stocker plusieurs valeurs du même type de données dans une seule colonne, ce qui est utile pour stocker des listes d'éléments tels que des tags, des catégories ou des fonctionnalités.
Étant donné que nous sommes déjà connectés à la base de données et que nous avons notre table products de l'étape précédente, ajoutons des colonnes de tableaux à notre table existante :
ALTER TABLE products ADD COLUMN name VARCHAR(255);
ALTER TABLE products ADD COLUMN tags TEXT[];
Ces commandes ajoutent deux nouvelles colonnes à notre table products existante : name (une chaîne de caractères) et tags (un tableau de chaînes de caractères). Le type de données TEXT[] spécifie que la colonne tags est un tableau de valeurs textuelles.
Vous devriez voir une sortie similaire à celle-ci pour chaque commande ALTER :
ALTER TABLE
Maintenant, mettons à jour nos données existantes et insérons de nouvelles données avec les nouvelles colonnes :
UPDATE products SET name = data ->> 'name' WHERE id = 1;
UPDATE products SET name = data ->> 'name' WHERE id = 2;
UPDATE products SET tags = ARRAY['electronics', 'computers', 'portable'] WHERE id = 1;
UPDATE products SET tags = ARRAY['electronics', 'accessories', 'input'] WHERE id = 2;
Ces commandes mettent à jour nos produits existants avec des informations de nom et de tags extraites des données JSONB et de nouvelles valeurs de tableaux.
Vous devriez voir une sortie similaire à celle-ci pour chaque mise à jour :
UPDATE 1
Pour interroger les données de tableaux, vous pouvez utiliser l'indexation de tableaux. Les indices de tableaux dans PostgreSQL commencent à 1.
Par exemple, pour récupérer le premier tag du premier produit, vous pouvez utiliser la requête suivante :
SELECT tags[1] FROM products WHERE id = 1;
Cette commande sélectionne l'élément à l'indice 1 du tableau tags de la table products, où l'id est 1.
Vous devriez voir une sortie similaire à celle-ci :
tags
-----------
electronics
(1 row)
Vous pouvez également utiliser la fonction UNNEST pour développer un tableau en un ensemble de lignes.
Par exemple, pour récupérer tous les tags de tous les produits, vous pouvez utiliser la requête suivante :
SELECT name, UNNEST(tags) AS tag FROM products;
Cette commande sélectionne le name et chaque tag individuel du tableau tags, créant une nouvelle ligne pour chaque tag.
Vous devriez voir une sortie similaire à celle-ci :
name | tag
---------+-------------
Laptop | electronics
Laptop | computers
Laptop | portable
Keyboard| electronics
Keyboard| accessories
Keyboard| input
(6 rows)
Vous pouvez utiliser l'opérateur @> pour vérifier si un tableau contient une valeur spécifique.
Par exemple, pour trouver tous les produits avec le tag 'electronics', vous pouvez utiliser la requête suivante :
SELECT name FROM products WHERE tags @> ARRAY['electronics'];
Cette commande sélectionne le nom de toutes les lignes de la table products où le tableau tags contient la valeur 'electronics'.
Vous devriez voir une sortie similaire à celle-ci :
name
----------
Laptop
Keyboard
(2 rows)
Vous pouvez également utiliser l'opérateur && pour vérifier si deux tableaux ont des éléments en commun.
Par exemple, pour trouver tous les produits qui partagent des tags avec le premier produit, vous pouvez utiliser la requête suivante :
SELECT p2.name FROM products p1, products p2 WHERE p1.id = 1 AND p1.tags && p2.tags AND p2.id != 1;
Cette commande sélectionne le nom de toutes les lignes de la table products (aliassée p2) qui ont au moins un tag en commun avec les tags du premier produit (aliassé p1), en excluant le premier produit lui-même.
Vous devriez voir une sortie similaire à celle-ci :
name
----------
Keyboard
(1 row)
Parfait ! Nous avons ajouté avec succès des colonnes de tableaux à notre table existante et appris à travailler avec les tableaux. Notre table products contient maintenant des types de données JSONB et de tableaux, la rendant prête pour la prochaine étape.