10.5.6 - Mantendo a Ordem na Casa - Constraints
Fala, guardião(ã) da ordem! Já manja tudo de criar tabelas, definir colunas, chaves e até manipular dados com SQL (CRUD + JOIN), né? Mas me diz: como a gente garante que os dados que entram no nosso banco Supabase sejam certinhos, sem erros e bagunça?
Imagina seu quarto: se não tiver umas regras (tipo, lugar certo pra cada coisa, não deixar roupa suja no chão), rapidinho vira zona, né? 😅
No banco, essas regras se chamam Constraints — tipo os “guardas de trânsito” do banco, que garantem que só dados válidos e organizados entrem nas tabelas.
Vamos conhecer as principais constraints que vão deixar nosso QG tinindo de organizado!
A Missão: Impor Regras e Garantir a Qualidade
Constraints são regras que definimos quando criamos a tabela (CREATE TABLE
) ou podemos acrescentar depois (ALTER TABLE
). Elas ficam nas colunas ou na tabela toda.
Por que usar Constraints?
Integridade: Dados sempre corretos e confiáveis.
Evitar Erros: Bloqueiam dados inválidos (ex: email repetido, campo vazio).
Consistência: Mantêm as ligações entre tabelas funcionando.
Regras de Negócio: Seu banco ajuda a aplicar as regras do seu projeto.
1. NOT NULL
: Campo Obrigatório! 🚫🕳️
NOT NULL
: Campo Obrigatório! 🚫🕳️Simples, mas poderosa. NOT NULL
significa que essa coluna nunca pode ficar vazia. Sempre que inserir (INSERT
) ou atualizar (UPDATE
), tem que ter valor nessa coluna.
Exemplo: Na tabela usuarios
, faz sentido que nome
e email
sejam obrigatórios, né? Sem nome ou email, nem cadastra!
CREATE TABLE usuarios (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
nome TEXT NOT NULL, -- nome obrigatório
email TEXT UNIQUE NOT NULL, -- email único e obrigatório
data_nascimento DATE,
cidade TEXT
);
Tentar inserir um usuário sem nome:
INSERT INTO usuarios (email, cidade) VALUES ('teste@email.com', 'Teste');
Vai dar erro! ❌
2. UNIQUE
: Nada de Repetecos! ☝️👯♀️🚫
UNIQUE
: Nada de Repetecos! ☝️👯♀️🚫UNIQUE
garante que os valores numa coluna (ou conjunto de colunas) sejam sempre diferentes. Nada de duplicar!
Exemplo: O email
tem que ser único na tabela usuarios
.
CREATE TABLE usuarios (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
nome TEXT NOT NULL,
email TEXT UNIQUE NOT NULL, -- garante unicidade
-- outras colunas...
);
Se tentar inserir um email que já existe:
INSERT INTO usuarios (nome, email) VALUES ('Outro Joao', 'joao.silva@email.com');
Vai dar erro! ❌
Dica:
UNIQUE
permite valoresNULL
, mas é melhor combinar comNOT NULL
se o campo for obrigatório e único.
3. DEFAULT
: Valor Padrão, na Faixa! 🤷♂️➡️🎁
DEFAULT
: Valor Padrão, na Faixa! 🤷♂️➡️🎁DEFAULT
define um valor padrão para a coluna, usado quando não especificamos nada ao inserir.
Exemplo: Na tabela posts
, que tal numero_likes
começar com zero? Ou o status do usuário ser 'ativo'
por padrão?
CREATE TABLE posts (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
texto_do_post TEXT NOT NULL,
usuario_id uuid REFERENCES usuarios(id),
data_publicacao TIMESTAMPTZ DEFAULT now(), -- data/hora atual
numero_likes INT DEFAULT 0 -- começa com zero
);
Inserir um post sem likes nem data:
INSERT INTO posts (texto_do_post, usuario_id) VALUES ('Meu post automático!', 'f47ac10b...');
O banco preenche numero_likes
com 0 e data_publicacao
com o horário atual automaticamente.
4. PRIMARY KEY
(PK): O RG Único 🔑🆔
PRIMARY KEY
(PK): O RG Único 🔑🆔Já vimos, mas reforçando: PRIMARY KEY
é especial. Junta NOT NULL
+ UNIQUE
, garantindo que a coluna (ou conjunto) identifica única e obrigatoriamente cada linha.
CREATE TABLE usuarios (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
-- ...
);
Também pode ser composta por várias colunas:
CREATE TABLE tabela_exemplo (
colunaA INT,
colunaB INT,
PRIMARY KEY (colunaA, colunaB) -- PK composta
);
Cada tabela tem uma única chave primária.
5. FOREIGN KEY
(FK): O Elo Secreto 🔗⛓️
FOREIGN KEY
(FK): O Elo Secreto 🔗⛓️Também já falamos: FK cria link entre tabelas, garantindo que o valor da FK exista na PK da tabela referenciada.
CREATE TABLE posts (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
texto_do_post TEXT NOT NULL,
usuario_id uuid REFERENCES usuarios(id), -- FK pra usuarios.id
-- ...
);
Ou:
CREATE TABLE posts (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
texto_do_post TEXT NOT NULL,
usuario_id uuid,
FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
);
Novidade: Ações da FK — ON DELETE
e ON UPDATE
ON DELETE
e ON UPDATE
Lembra do problema de apagar um usuário que tem posts? Essas ações definem o que acontece:
ON DELETE {ação}
: o que fazer na tabela filha se apagar a linha na tabela pai.ON UPDATE {ação}
: o que fazer na tabela filha se atualizar a PK da tabela pai (raro).
Ações possíveis:
NO ACTION
ouRESTRICT
: Impede apagar ou atualizar na tabela pai se tiver filhos. (Mais seguro)CASCADE
: Apaga/atualiza na tabela filha automaticamente. (Cuidado!)SET NULL
: Define FK comoNULL
se pai for apagado. FK precisa aceitarNULL
.SET DEFAULT
: Define FK com valor padrão.
Exemplo perigoso, mas prático:
CREATE TABLE posts (
usuario_id uuid,
FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
ON DELETE CASCADE -- Apaga posts se apagar usuário
);
Exemplo seguro:
CREATE TABLE posts (
usuario_id uuid, -- permite NULL
FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
ON DELETE SET NULL -- posts ficam sem autor
);
E no Supabase?
No editor de tabelas, ao criar ou editar FK, você escolhe as ações ON DELETE
e ON UPDATE
.
Ufa! Constraints são as guardiãs da ordem do banco de dados, mantendo tudo limpo, seguro e funcionando certinho.
Last updated