Dados podem ser muitos, mas nem todos são úteis. Pra sua tabela não virar uma bagunça, o PostgreSQL deixa você colocar restrições. É tipo umas regras básicas pra ninguém colocar número no campo "nome" ou deixar ele vazio.
O que são constraints?
Restrições (constraints) no PostgreSQL são tipo regras de convivência no exército. Se não tiver, cada um faz o que quiser: coloca idade do usuário como -999, adiciona string vazia no lugar do nome ou cadastra o mesmo estudante duas vezes com id diferente. Pra evitar isso, o PostgreSQL tem uns mecanismos de controle chamados restrições.
As restrições servem pra:
- Deixar seus dados válidos e consistentes.
- Garantir que os dados seguem certas regras (tipo, idade não pode ser negativa).
- Ajudar a achar erro mais rápido se os dados não forem o que você espera.
Hoje a gente vai ver duas das restrições mais comuns: NOT NULL e UNIQUE.
Restrição NOT NULL
A restrição NOT NULL fala pro PostgreSQL: "Ei, esse campo sempre tem que ter valor. Nada de indefinição aqui!". Se você tentar colocar uma linha com NULL nessa tabela, o PostgreSQL vai dar erro. Isso é muito útil pra campos obrigatórios, tipo nome ou data de nascimento do estudante.
Exemplo de uso do NOT NULL
CREATE TABLE teachers (
id SERIAL PRIMARY KEY, -- Identificador único
name VARCHAR(100) NOT NULL, -- Nome do professor (obrigatório)
subject VARCHAR(50) NOT NULL -- Matéria que ele dá (obrigatório)
);
Nesse exemplo, as colunas name e subject não podem ficar vazias. Se você tentar inserir uma linha sem esses valores, vai dar erro.
INSERT INTO teachers (name, subject)
VALUES (NULL, 'Matemática');
Resultado: erro! Você não colocou o nome do professor, e name exige valor.
Restrição UNIQUE: precisa ser único
A restrição UNIQUE garante que os valores numa coluna ou numa combinação de colunas não vão se repetir. Isso é útil, por exemplo, pra garantir que dois estudantes não tenham o mesmo número de matrícula.
Se NOT NULL é tipo "todo mundo tem que estar vestido", UNIQUE é "ninguém pode usar o mesmo vestido na festa".
Exemplo de uso do UNIQUE
CREATE TABLE departments (
id SERIAL PRIMARY KEY, -- Identificador único
name VARCHAR(100) UNIQUE -- Nome do departamento tem que ser único
);
Agora você não consegue adicionar dois departamentos com o mesmo nome.
INSERT INTO departments (name) VALUES ('Matemática');
INSERT INTO departments (name) VALUES ('Matemática');
Resultado: erro! Tentou inserir valor duplicado na coluna name.
Restrição UNIQUE combinada
Você também pode exigir unicidade pra combinação de duas (ou mais) colunas. Tipo assim:
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY, -- Identificador único do registro
student_id INTEGER NOT NULL, -- ID do estudante
course_id INTEGER NOT NULL, -- ID do curso
UNIQUE (student_id, course_id) -- Um estudante não pode se inscrever duas vezes no mesmo curso
);
Agora cada par student_id e course_id tem que ser único. Se alguém tentar inscrever o mesmo estudante duas vezes no mesmo curso, o PostgreSQL não deixa.
Combinando restrições: NOT NULL e UNIQUE
Você pode juntar NOT NULL e UNIQUE na mesma coluna. Por exemplo:
CREATE TABLE users (
username VARCHAR(50) NOT NULL UNIQUE, -- Login único, obrigatório
email VARCHAR(100) NOT NULL UNIQUE -- Email único, obrigatório
);
Aqui o login e o email têm que ser únicos e não podem ficar vazios.
Erros comuns ao usar restrições
Se você coloca UNIQUE numa coluna mas não coloca NOT NULL, dá pra inserir várias linhas com valor NULL, porque o PostgreSQL acha que NULL não é igual a outro NULL. Se quiser proibir valores vazios, coloca também NOT NULL.
Tentar inserir valor duplicado numa coluna com UNIQUE vai dar erro. Sempre confere os dados antes de rodar o INSERT.
Colocar restrição demais pode deixar as operações de insert mais lentas.
Pra que serve tudo isso?
Usar restrições evita um monte de problema, tipo dados duplicados, campos vazios e outros erros que acontecem por causa de distração humana. Elas deixam seu banco de dados "autoprotetor", e em projetos grandes isso economiza um tempo precioso. Em entrevistas sempre perguntam sobre restrições, então saber NOT NULL e UNIQUE não é só útil, mas pode impressionar o futuro chefe.
Na próxima aula a gente vai ver a restrição DEFAULT, que deixa você colocar valores padrão nas colunas se o usuário não informar nada. Até mais!
GO TO FULL VERSION