Array-Spalten zu bestehender Tabelle hinzufügen
In diesem Schritt lernen Sie, wie Sie Array-Spalten in PostgreSQL hinzufügen und manipulieren. Wir erweitern unsere bestehende products-Tabelle um eine Array-Spalte zur Speicherung von Tags. Array-Spalten ermöglichen es Ihnen, mehrere Werte desselben Datentyps in einer einzigen Spalte zu speichern, was nützlich ist, um Listen von Elementen wie Tags, Kategorien oder Funktionen zu speichern.
Da wir bereits mit der Datenbank verbunden sind und unsere products-Tabelle aus dem vorherigen Schritt haben, fügen wir unserer bestehenden Tabelle Array-Spalten hinzu:
ALTER TABLE products ADD COLUMN name VARCHAR(255);
ALTER TABLE products ADD COLUMN tags TEXT[];
Diese Befehle fügen zwei neue Spalten zu unserer bestehenden products-Tabelle hinzu: name (ein String) und tags (ein Array von Strings). Der Datentyp TEXT[] gibt an, dass die Spalte tags ein Array von Textwerten ist.
Sie sollten für jeden ALTER-Befehl eine Ausgabe ähnlich dieser sehen:
ALTER TABLE
Nun aktualisieren wir unsere bestehenden Daten und fügen neue Daten mit den neuen Spalten ein:
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;
Diese Befehle aktualisieren unsere bestehenden Produkte mit Namens- und Tag-Informationen, die aus den JSONB-Daten extrahiert wurden, sowie mit neuen Array-Werten.
Sie sollten für jede Aktualisierung eine Ausgabe ähnlich dieser sehen:
UPDATE 1
Um die Array-Daten abzufragen, können Sie die Array-Indizierung verwenden. Array-Indizes beginnen in PostgreSQL bei 1.
Um beispielsweise den ersten Tag des ersten Produkts abzurufen, können Sie die folgende Abfrage verwenden:
SELECT tags[1] FROM products WHERE id = 1;
Dieser Befehl wählt das Element am Index 1 aus dem tags-Array der products-Tabelle aus, wobei die id 1 ist.
Sie sollten eine Ausgabe ähnlich dieser sehen:
tags
-----------
electronics
(1 row)
Sie können auch die Funktion UNNEST verwenden, um ein Array in eine Menge von Zeilen zu erweitern.
Um beispielsweise alle Tags von allen Produkten abzurufen, können Sie die folgende Abfrage verwenden:
SELECT name, UNNEST(tags) AS tag FROM products;
Dieser Befehl wählt den name und jeden einzelnen tag aus dem tags-Array aus und erstellt für jeden Tag eine neue Zeile.
Sie sollten eine Ausgabe ähnlich dieser sehen:
name | tag
---------+-------------
Laptop | electronics
Laptop | computers
Laptop | portable
Keyboard| electronics
Keyboard| accessories
Keyboard| input
(6 rows)
Sie können den Operator @> verwenden, um zu überprüfen, ob ein Array einen bestimmten Wert enthält.
Um beispielsweise alle Produkte mit dem Tag 'electronics' zu finden, können Sie die folgende Abfrage verwenden:
SELECT name FROM products WHERE tags @> ARRAY['electronics'];
Dieser Befehl wählt den Namen aller Zeilen aus der products-Tabelle aus, bei denen das tags-Array den Wert 'electronics' enthält.
Sie sollten eine Ausgabe ähnlich dieser sehen:
name
----------
Laptop
Keyboard
(2 rows)
Sie können auch den Operator && verwenden, um zu überprüfen, ob zwei Arrays gemeinsame Elemente haben.
Um beispielsweise alle Produkte zu finden, die Tags mit dem ersten Produkt gemeinsam haben, können Sie die folgende Abfrage verwenden:
SELECT p2.name FROM products p1, products p2 WHERE p1.id = 1 AND p1.tags && p2.tags AND p2.id != 1;
Dieser Befehl wählt den Namen aller Zeilen aus der products-Tabelle (alias p2) aus, die mindestens einen Tag mit den Tags des ersten Produkts (alias p1) gemeinsam haben, wobei das erste Produkt selbst ausgeschlossen wird.
Sie sollten eine Ausgabe ähnlich dieser sehen:
name
----------
Keyboard
(1 row)
Perfekt! Wir haben erfolgreich Array-Spalten zu unserer bestehenden Tabelle hinzugefügt und gelernt, wie man mit Arrays arbeitet. Unsere products-Tabelle enthält nun sowohl JSONB- als auch Array-Datentypen und ist somit für den nächsten Schritt bereit.