Hoje a gente termina nossa jornada maneira sobre arrays no PostgreSQL. O papo de hoje é sobre os erros clássicos que você pode encontrar e, o mais importante, como não cair neles. Se você já pensou "esse array tá fazendo coisa estranha de novo", essa aula é pra você. Bora entender tudo.
Erros na criação de arrays: problemas com tipos de dados dentro do array
Quando você cria arrays no PostgreSQL, tem que lembrar que todos os elementos do array precisam ser do mesmo tipo. Por exemplo:
SELECT ARRAY[1, 2, 'três'];
-- Erro: todos os elementos do array precisam ser do mesmo tipo
O PostgreSQL não deixa misturar número e string no mesmo array. Se precisar disso, faz a conversão:
SELECT ARRAY[1::TEXT, 2::TEXT, 'três'];
-- Agora o array é de strings
Erros ao usar ARRAY[] com tipos de dados diferentes
Por padrão, o PostgreSQL tenta adivinhar o tipo do array pelo que tem dentro. Se você passar dados meio confusos, pode dar ruim:
SELECT ARRAY[1, NULL];
-- Erro: o PostgreSQL não sabe como interpretar NULL
Pra resolver, fala logo qual é o tipo do array:
SELECT ARRAY[1, NULL]::INTEGER[];
-- Agora funciona de boa
Erros ao extrair dados: problemas com índices do array
Se você já programa em Python ou JavaScript, onde o índice começa do zero, vai se surpreender no PostgreSQL. Aqui, os arrays começam a indexar do 1.
SELECT ARRAY[10, 20, 30][0];
-- Erro: o índice tem que começar do 1
O jeito certo:
SELECT ARRAY[10, 20, 30][1];
-- Resultado: 10
Erros ao usar funções pra extrair
Funções tipo unnest() podem confundir, porque elas "desdobram" o array em várias linhas:
CREATE TEMP TABLE exemplo (
id SERIAL PRIMARY KEY,
tags TEXT[]
);
INSERT INTO exemplo (tags) VALUES (ARRAY['tag1', 'tag2']), (ARRAY['tag3']);
SELECT unnest(tags) FROM exemplo;
-- Resultado:
-- tag1
-- tag2
-- tag3
Se você quiser manter o contexto da linha (tipo o id), coloca ele junto:
SELECT id, unnest(tags) AS tag FROM exemplo;
-- Resultado:
-- id | tag
-- 1 | tag1
-- 1 | tag2
-- 2 | tag3
Erros ao filtrar e comparar arrays
- Uso errado dos operadores
@>,<@,&&
Esses operadores servem pra funções específicas:
@>checa se um array contém outro array.<@checa se um array está dentro de outro.&&checa se dois arrays têm interseção.
O erro rola quando você usa eles do jeito errado:
SELECT ARRAY[1, 2, 3] @> 2;
-- Erro: o operador @> é pra arrays
O jeito certo:
SELECT ARRAY[1, 2, 3] @> ARRAY[2];
-- Resultado: true
- Problemas de performance sem índices
Se você usa muito esses operadores de array e sente que as queries tão lentas, provavelmente esqueceu de criar índice. Olha como faz:
CREATE INDEX idx_tags ON exemplo USING GIN (tags);
Agora as queries com @> e && vão rodar bem mais rápido.
Erros ao modificar arrays
- Remover e adicionar valores
As funções array_remove() e array_append() não mudam o array "no lugar", elas devolvem um array novo. Se você acha que o array original vai mudar sozinho, tá errado:
UPDATE exemplo
SET tags = array_remove(tags, 'tag1');
-- Agora o array foi atualizado
Se esquecer de colocar SET tags =, o SQL roda mas o array não muda.
- Duplicação de dados usando
array_append()
A função array_append() não checa se o elemento já existe. Isso pode gerar duplicata:
SELECT array_append(ARRAY['tag1', 'tag2'], 'tag1');
-- Resultado: {tag1, tag2, tag1}
Se quiser evitar duplicata, faz uma filtragem:
SELECT array_remove(array_append(ARRAY['tag1', 'tag2'], 'tag1'), 'tag1') || 'tag1';
-- Resultado: {tag1, tag2}
Dicas pra evitar erros
Pra não cair nesses erros aí de cima quando mexer com arrays:
- Confere os tipos de dados. Sempre fala qual é o tipo do array se tiver dúvida.
- Fica ligado nos índices. Lembra que array no PostgreSQL começa do 1.
- Otimiza as queries com array. Usa índice pra acelerar comparação e filtro.
- Testa em amostras pequenas. Se a query com array tá lenta, testa com poucos dados pra achar o gargalo.
- Evita duplicata. Faz checagem extra quando for adicionar elemento no array, se não pode repetir.
Arrays no PostgreSQL, igual qualquer ferramenta poderosa, merecem respeito e cuidado. Seguindo essas dicas, seus arrays nunca mais vão te tirar o sono (ou quase nunca). Boa sorte na modelagem e otimização dos bancos de dados!
GO TO FULL VERSION