Às vezes, não basta só ler arrays, né? Tem hora que a gente precisa mudar: adicionar um valor novo, tirar um antigo, atualizar o conteúdo. Ainda bem que no PostgreSQL tem funções próprias pra isso, que deixam tudo bem mais fácil, sem precisar reescrever o array na mão: array_append() e array_remove(). Bora ver como funciona.
Adicionando elementos em um array com array_append()
A função array_append() serve pra colocar um novo elemento no final do array. Ela recebe dois argumentos:
- O array original que tu quer modificar.
- O valor que tu quer adicionar no array.
Exemplo 1: Array simples de números
Imagina que a gente tem uma tabela projects com a coluna team_members, onde ficam arrays com os IDs dos usuários que tão trampando no projeto.
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
team_members INT[]
);
-- Bora adicionar umas linhas
INSERT INTO projects (name, team_members)
VALUES
('Projeto A', ARRAY[1, 2, 3]),
('Projeto B', ARRAY[4, 5]);
Agora temos o projeto "Projeto A" e queremos colocar um novo membro com o ID 7 no array team_members. Usamos o array_append():
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Projeto A';
-- Bora conferir o resultado:
SELECT * FROM projects;
Resultado:
| id | name | team_members |
|---|---|---|
| 1 | Projeto A | {1,2,3,7} |
| 2 | Projeto B | {4,5} |
Viu só? O membro com ID 7 foi adicionado no array de boa!
Exemplo 2: Adicionando elementos de texto
O mesmo array_append() serve pra arrays de outros tipos também. Por exemplo, bora adicionar uma categoria nova no array de categorias de produtos.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
categories TEXT[]
);
-- Adicionando produto com categorias
INSERT INTO products (name, categories)
VALUES
('Smartphone', ARRAY['Eletrônicos', 'Gadgets']),
('Notebook', ARRAY['Computadores', 'Eletrônicos']);
-- Adicionando nova categoria "Popular" pro "Smartphone"
UPDATE products
SET categories = array_append(categories, 'Popular')
WHERE name = 'Smartphone';
-- Bora conferir o resultado:
SELECT * FROM products;
Resultado:
| id | name | categories |
|---|---|---|
| 1 | Smartphone | {Eletrônicos,Gadgets,Popular} |
| 2 | Notebook | {Computadores,Eletrônicos} |
Removendo elementos de um array com array_remove()
Se o array_append() é tipo adicionar uma tarefa nova na lista, o array_remove() é pra riscar o que já foi feito. Essa função recebe como argumentos:
- O array original.
- O valor que tu quer remover.
Exemplo 1: Removendo elemento de um array de números
Bora voltar pra tabela projects. Descobrimos que o membro com ID 7 não tá mais no projeto "Projeto A". Vamos tirar ele do array team_members:
UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = 'Projeto A';
-- Bora conferir o resultado:
SELECT * FROM projects;
Resultado:
| id | name | team_members |
|---|---|---|
| 1 | Projeto A | {1,2,3} |
| 2 | Projeto B | {4,5} |
A função array_remove() tirou o membro com ID 7 numa boa.
Exemplo 2: Removendo elemento de texto
Agora bora olhar pra tabela products. Se a categoria "Popular" não faz mais sentido pro smartphone, dá pra remover ela:
UPDATE products
SET categories = array_remove(categories, 'Popular')
WHERE name = 'Smartphone';
-- Bora conferir o resultado:
SELECT * FROM products;
Resultado:
| id | name | categories |
|---|---|---|
| 1 | Smartphone | {Eletrônicos,Gadgets} |
| 2 | Notebook | {Computadores,Eletrônicos} |
se o elemento que tu tenta remover não tá no array, o array_remove() deixa o array do jeito que tava. Isso é massa, porque não rola erro nenhum.
Combinando array_append() e array_remove()
Às vezes, a gente precisa garantir que o elemento não tá no array antes de adicionar. Dá pra fazer isso combinando funções:
Exemplo: Adicionando elementos únicos
Bora garantir que o membro com ID 7 só vai ser adicionado se ainda não estiver no array. Pra isso, usamos uma checagem com array_remove():
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Projeto A' AND NOT (team_members @> ARRAY[7]);
-- Bora conferir o resultado:
SELECT * FROM projects;
Explicação:
- O operador
@>verifica se o array tem o elemento7. - Se
team_membersjá tem o7, não adiciona de novo.
Erros comuns e dicas
1. Tentar adicionar NULL no array. Se tu tentar usar array_append() com NULL (tipo, array_append(team_members, NULL)), vai acabar colocando um NULL no array. Não dá erro, mas pode não ser o que tu queria. Pra evitar isso, sempre confere se o valor não é NULL antes de adicionar.
-- Exemplo de checagem:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = 'Projeto A';
2. Tipos diferentes no mesmo array. Arrays no PostgreSQL só aceitam valores do mesmo tipo. Tipo, não dá pra colocar uma string num array de números:
-- Isso vai dar erro:
UPDATE projects
SET team_members = array_append(team_members, 'exemplo');
Pra não dar ruim, garante que os tipos batem. Se ficar na dúvida, converte o valor pro tipo certo usando :::
-- Exemplo de conversão de tipo:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
GO TO FULL VERSION