Иногда массивы нужно не только читать, но и менять: добавить новое значение, удалить устаревшее, обновить содержимое. К счастью, в PostgreSQL для этого есть специальные функции, которые позволяют легко управлять содержимым массивов, не переписывая их вручную,array_append() и array_remove(). Посмотрим, как они работают.
Добавление элементов в массив с array_append()
Функция array_append() используется для добавления нового элемента в конец массива. Она принимает два аргумента:
- Исходный массив, который вы хотите модифицировать.
- Значение, которое вы хотите добавить в массив.
Пример 1: Простой массив чисел
Предположим, у нас есть таблица projects с колонкой team_members, где хранятся массивы идентификаторов пользователей, работающих над проектом.
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
team_members INT[]
);
-- Добавим несколько строк
INSERT INTO projects (name, team_members)
VALUES
('Проект A', ARRAY[1, 2, 3]),
('Проект B', ARRAY[4, 5]);
Теперь у нас есть проект "Проект A", и мы хотим добавить нового участника с идентификатором 7 в массив team_members. Используем array_append():
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Проект A';
-- Проверим результат:
SELECT * FROM projects;
Результат:
| id | name | team_members |
|---|---|---|
| 1 | Проект A | {1,2,3,7} |
| 2 | Проект B | {4,5} |
Как видите, участник с ID 7 успешно добавлен в массив!
Пример 2: Добавление текстовых элементов
Тот же array_append() можно использовать для работы с массивами других типов. Например, мы добавим новую категорию в массив категорий товаров.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
categories TEXT[]
);
-- Добавим продукт с категориями
INSERT INTO products (name, categories)
VALUES
('Смартфон', ARRAY['Электроника', 'Гаджеты']),
('Ноутбук', ARRAY['Компьютеры', 'Электроника']);
-- Добавим новую категорию "Популярное" для "Смартфона"
UPDATE products
SET categories = array_append(categories, 'Популярное')
WHERE name = 'Смартфон';
-- Проверим результат:
SELECT * FROM products;
Результат:
| id | name | categories |
|---|---|---|
| 1 | Смартфон | {Электроника,Гаджеты,Популярное} |
| 2 | Ноутбук | {Компьютеры,Электроника} |
Удаление элементов из массива с array_remove()
Если array_append() похож на добавление новой задачи в список, то array_remove() — это инструмент для вычёркивания уже сделанной задачи. Эта функция принимает в качестве аргументов:
- Исходный массив.
- Значение, которое вы хотите удалить.
Пример 1: Удаление элемента из массива чисел
Давайте вернёмся к таблице projects. Мы узнали, что участник с ID 7 больше не работает на проекте "Проект A". Удалим его из массива team_members:
UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = 'Проект A';
-- Проверим результат:
SELECT * FROM projects;
Результат:
| id | name | team_members |
|---|---|---|
| 1 | Проект A | {1,2,3} |
| 2 | Проект B | {4,5} |
Функция array_remove() успешно удалила участника с ID 7.
Пример 2: Удаление текстового элемента
Теперь посмотрим на таблицу products. Если категория "Популярное" больше не актуальна для смартфона, мы можем удалить её:
UPDATE products
SET categories = array_remove(categories, 'Популярное')
WHERE name = 'Смартфон';
-- Проверим результат:
SELECT * FROM products;
Результат:
| id | name | categories |
|---|---|---|
| 1 | Смартфон | {Электроника,Гаджеты} |
| 2 | Ноутбук | {Компьютеры,Электроника} |
если элемент, который вы пытаетесь удалить, отсутствует в массиве, array_remove() оставляет массив без изменений. Это очень удобно, ведь никаких ошибок при этом не возникает.
Комбинирование array_append() и array_remove()
Иногда нам нужно сначала убедиться, что элемент отсутствует в массиве, и только затем добавить его. Это можно сделать с помощью комбинации функций:
Пример: Добавление уникальных элементов
Давайте убедимся, что участник с ID 7 добавляется в массив только в том случае, если его там ещё нет. Для этого используем проверку с array_remove():
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Проект A' AND NOT (team_members @> ARRAY[7]);
-- Проверим результат:
SELECT * FROM projects;
Объяснение:
- Оператор
@>проверяет, содержит ли массив элемент7. - Если
team_membersуже содержит7, добавление не выполняется.
Типичные ошибки и рекомендации
1. Попытка добавить NULL в массив. Если вы попробуете использовать array_append() с NULL (например, array_append(team_members, NULL)), это приведёт к добавлению значения NULL в массив. При этом никакой ошибки не произойдёт, но результат может быть не тем, что вы ожидали. Чтобы избежать этого, перед добавлением проверяйте, что значение не является NULL.
-- Пример проверки:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = 'Проект A';
2. Разные типы данных в массиве. Массивы в PostgreSQL должны содержать значения одного типа. Например, вы не можете добавить в числовой массив строку:
-- Это вызовет ошибку:
UPDATE projects
SET team_members = array_append(team_members, 'example');
Чтобы избежать этого, убедитесь, что типы данных совпадают. Если не уверены, приводите значение к нужному типу с помощью :::
-- Пример приведения типов:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ