Добавление столбцов с массивами в существующую таблицу
На этом этапе вы научитесь добавлять и работать со столбцами массивов в PostgreSQL. Мы расширим нашу существующую таблицу products, добавив столбец массива для хранения тегов. Столбцы массивов позволяют хранить несколько значений одного и того же типа данных в одном столбце, что полезно для хранения списков элементов, таких как теги, категории или функции.
Поскольку мы уже подключены к базе данных и у нас есть таблица products из предыдущего шага, давайте добавим столбцы массивов в нашу существующую таблицу:
ALTER TABLE products ADD COLUMN name VARCHAR(255);
ALTER TABLE products ADD COLUMN tags TEXT[];
Эти команды добавляют два новых столбца в нашу существующую таблицу products: name (строка) и tags (массив строк). Тип данных TEXT[] указывает, что столбец tags является массивом текстовых значений.
Для каждой команды ALTER вы должны увидеть вывод, похожий на этот:
ALTER TABLE
Теперь давайте обновим существующие данные и вставим новые данные с новыми столбцами:
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;
Эти команды обновляют наши существующие продукты, добавляя информацию об имени и тегах, извлеченную из данных JSONB, и новые значения массивов.
Для каждого обновления вы должны увидеть вывод, похожий на этот:
UPDATE 1
Для запроса данных массива вы можете использовать индексацию массива. Индексы массива в PostgreSQL начинаются с 1.
Например, чтобы получить первый тег первого продукта, вы можете использовать следующий запрос:
SELECT tags[1] FROM products WHERE id = 1;
Эта команда выбирает элемент с индексом 1 из массива tags таблицы products, где id равен 1.
Вы должны увидеть вывод, похожий на этот:
tags
-----------
electronics
(1 row)
Вы также можете использовать функцию UNNEST для разворачивания массива в набор строк.
Например, чтобы получить все теги всех продуктов, вы можете использовать следующий запрос:
SELECT name, UNNEST(tags) AS tag FROM products;
Эта команда выбирает name и каждый отдельный tag из массива tags, создавая новую строку для каждого тега.
Вы должны увидеть вывод, похожий на этот:
name | tag
---------+-------------
Laptop | electronics
Laptop | computers
Laptop | portable
Keyboard| electronics
Keyboard| accessories
Keyboard| input
(6 rows)
Вы можете использовать оператор @> для проверки того, содержит ли массив определенное значение.
Например, чтобы найти все продукты с тегом 'electronics', вы можете использовать следующий запрос:
SELECT name FROM products WHERE tags @> ARRAY['electronics'];
Эта команда выбирает имя всех строк из таблицы products, где массив tags содержит значение 'electronics'.
Вы должны увидеть вывод, похожий на этот:
name
----------
Laptop
Keyboard
(2 rows)
Вы также можете использовать оператор && для проверки того, имеют ли два массива общие элементы.
Например, чтобы найти все продукты, которые имеют общие теги с первым продуктом, вы можете использовать следующий запрос:
SELECT p2.name FROM products p1, products p2 WHERE p1.id = 1 AND p1.tags && p2.tags AND p2.id != 1;
Эта команда выбирает имя всех строк из таблицы products (с псевдонимом p2), которые имеют хотя бы один общий тег с тегами первого продукта (с псевдонимом p1), исключая сам первый продукт.
Вы должны увидеть вывод, похожий на этот:
name
----------
Keyboard
(1 row)
Отлично! Мы успешно добавили столбцы массивов в нашу существующую таблицу и научились работать с массивами. Наша таблица products теперь содержит типы данных JSONB и массивов, что делает ее готовой к следующему шагу.