Czasem tablice trzeba nie tylko czytać, ale też modyfikować: dodać nową wartość, usunąć starą, zaktualizować zawartość. Na szczęście w PostgreSQL są do tego specjalne funkcje, które pozwalają łatwo zarządzać zawartością tablic bez ręcznego przepisywania ich: array_append() i array_remove(). Zobaczmy, jak to działa.
Dodawanie elementów do tablicy z array_append()
Funkcja array_append() służy do dodawania nowego elementu na koniec tablicy. Przyjmuje dwa argumenty:
- Tablica, którą chcesz zmodyfikować.
- Wartość, którą chcesz dodać do tablicy.
Przykład 1: Prosta tablica liczb
Załóżmy, że mamy tabelę projects z kolumną team_members, gdzie trzymane są tablice identyfikatorów użytkowników pracujących nad projektem.
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
team_members INT[]
);
-- Dodajmy kilka wierszy
INSERT INTO projects (name, team_members)
VALUES
('Projekt A', ARRAY[1, 2, 3]),
('Projekt B', ARRAY[4, 5]);
Teraz mamy projekt "Projekt A" i chcemy dodać nowego członka z identyfikatorem 7 do tablicy team_members. Użyjemy array_append():
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Projekt A';
-- Sprawdźmy wynik:
SELECT * FROM projects;
Wynik:
| id | name | team_members |
|---|---|---|
| 1 | Projekt A | {1,2,3,7} |
| 2 | Projekt B | {4,5} |
Jak widzisz, członek z ID 7 został pomyślnie dodany do tablicy!
Przykład 2: Dodawanie elementów tekstowych
To samo array_append() możesz użyć do pracy z tablicami innych typów. Na przykład dodamy nową kategorię do tablicy kategorii produktów.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
categories TEXT[]
);
-- Dodajmy produkt z kategoriami
INSERT INTO products (name, categories)
VALUES
('Smartfon', ARRAY['Elektronika', 'Gadżety']),
('Laptop', ARRAY['Komputery', 'Elektronika']);
-- Dodajmy nową kategorię "Popularne" dla "Smartfona"
UPDATE products
SET categories = array_append(categories, 'Popularne')
WHERE name = 'Smartfon';
-- Sprawdźmy wynik:
SELECT * FROM products;
Wynik:
| id | name | categories |
|---|---|---|
| 1 | Smartfon | {Elektronika,Gadżety,Popularne} |
| 2 | Laptop | {Komputery,Elektronika} |
Usuwanie elementów z tablicy z array_remove()
Jeśli array_append() to jak dodanie nowego zadania do listy, to array_remove() jest narzędziem do wykreślania już zrobionego zadania. Ta funkcja przyjmuje jako argumenty:
- Tablica źródłowa.
- Wartość, którą chcesz usunąć.
Przykład 1: Usuwanie elementu z tablicy liczb
Wróćmy do tabeli projects. Dowiedzieliśmy się, że członek z ID 7 już nie pracuje przy projekcie "Projekt A". Usuńmy go z tablicy team_members:
UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = 'Projekt A';
-- Sprawdźmy wynik:
SELECT * FROM projects;
Wynik:
| id | name | team_members |
|---|---|---|
| 1 | Projekt A | {1,2,3} |
| 2 | Projekt B | {4,5} |
Funkcja array_remove() skutecznie usunęła członka z ID 7.
Przykład 2: Usuwanie elementu tekstowego
Teraz spójrzmy na tabelę products. Jeśli kategoria "Popularne" już nie jest aktualna dla smartfona, możemy ją usunąć:
UPDATE products
SET categories = array_remove(categories, 'Popularne')
WHERE name = 'Smartfon';
-- Sprawdźmy wynik:
SELECT * FROM products;
Wynik:
| id | name | categories |
|---|---|---|
| 1 | Smartfon | {Elektronika,Gadżety} |
| 2 | Laptop | {Komputery,Elektronika} |
jeśli element, który próbujesz usunąć, nie istnieje w tablicy, array_remove() zostawia tablicę bez zmian. To bardzo wygodne, bo nie pojawia się żaden błąd.
Kombinowanie array_append() i array_remove()
Czasem trzeba najpierw upewnić się, że elementu nie ma w tablicy, i dopiero potem go dodać. Można to zrobić za pomocą kombinacji funkcji:
Przykład: Dodawanie unikalnych elementów
Upewnijmy się, że członek z ID 7 zostanie dodany do tablicy tylko wtedy, gdy jeszcze go tam nie ma. Użyjemy do tego sprawdzenia z array_remove():
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Projekt A' AND NOT (team_members @> ARRAY[7]);
-- Sprawdźmy wynik:
SELECT * FROM projects;
Wyjaśnienie:
- Operator
@>sprawdza, czy tablica zawiera element7. - Jeśli
team_membersjuż zawiera7, dodanie nie zostanie wykonane.
Typowe błędy i porady
1. Próba dodania NULL do tablicy. Jeśli spróbujesz użyć array_append() z NULL (np. array_append(team_members, NULL)), to spowoduje dodanie wartości NULL do tablicy. Nie pojawi się żaden błąd, ale wynik może być nie taki, jak oczekujesz. Żeby tego uniknąć, przed dodaniem sprawdź, czy wartość nie jest NULL.
-- Przykład sprawdzenia:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = 'Projekt A';
2. Różne typy danych w tablicy. Tablice w PostgreSQL muszą zawierać wartości tego samego typu. Na przykład nie możesz dodać do tablicy liczb tekstu:
-- To spowoduje błąd:
UPDATE projects
SET team_members = array_append(team_members, 'example');
Żeby tego uniknąć, upewnij się, że typy danych się zgadzają. Jeśli nie jesteś pewien, rzutuj wartość na odpowiedni typ za pomocą :::
-- Przykład rzutowania typów:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
GO TO FULL VERSION