CodeGym /Cursos /SQL SELF /Adicionando restrições ao criar tabelas: NOT NULL, UNIQUE...

Adicionando restrições ao criar tabelas: NOT NULL, UNIQUE

SQL SELF
Nível 17 , Lição 1
Disponível

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:

  1. Deixar seus dados válidos e consistentes.
  2. Garantir que os dados seguem certas regras (tipo, idade não pode ser negativa).
  3. 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!

2
Tarefa
SQL SELF, nível 17, lição 1
Bloqueado
Criação de tabela com restrição `NOT NULL`
Criação de tabela com restrição `NOT NULL`
2
Tarefa
SQL SELF, nível 17, lição 1
Bloqueado
Criação de uma tabela com restrição `UNIQUE`
Criação de uma tabela com restrição `UNIQUE`
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION