UC2 · Implementar Banco de Dados

Constraints e Relacionamentos

Aula 11 — Ligando as tabelas de verdade

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

O mapa de hoje

  • Bloco 1 — integridade referencial: a chave estrangeira em SQL
  • Bloco 2 — as outras constraints: NOT NULL, UNIQUE, CHECK, DEFAULT
  • Bloco 3 — ordem de criação, ON DELETE e como consertar sem recomeçar
  • Bloco 4 — mão na massa: criar todas as tabelas do projeto
No fim de hoje, o banco de vocês está completo e vazio. Os dados entram na Aula 12.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone Lembrete — a legenda do DER

Lembrete da legenda do DER: entidade, atributo, chave primaria, chave estrangeira, relacionamento e cardinalidade

Hoje o * vira PRIMARY KEY e o CE/FK vira REFERENCES.
O desenho e o SQL passam a dizer a mesma coisa.

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Retomando a Aula 10

  • Qual comando cria uma tabela?
  • O que SERIAL faz?
  • O que NOT NULL garante?
  • Onde você confere em qual banco o Query Tool está?
Abram o arquivo .sql do grupo e o DER lado a lado. São os dois insumos de hoje.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Bloco 1

Integridade referencial

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone O problema — a linha que aponta para o nada

Nas tabelas de ontem, nada impede isto:

INSERT INTO jogo (titulo, id_plataforma) VALUES ('God of War', 7);

E se não existe plataforma com id_plataforma = 7?

  • O jogo fica órfão: aponta para uma plataforma que não existe
  • A consulta "jogos do PS5" nunca acha ele
  • Ninguém é avisado
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone A solução — REFERENCES

CREATE TABLE jogo (
    id_jogo        SERIAL       PRIMARY KEY,
    titulo         VARCHAR(150) NOT NULL,
    genero         VARCHAR(40),
    id_plataforma  INTEGER      REFERENCES plataforma(id_plataforma)
);
EN PT
REFERENCES referencia — aponta para
foreign key constraint restrição de chave estrangeira
referential integrity integridade referencial
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone O que o banco faz agora

Um INSERT com id_plataforma igual a 7 so e gravado se existir plataforma com id 7; senao o banco recusa

Essa é a garantia 2 da Aula 01 — integridade — funcionando. O banco recusa o dado errado em vez de aceitar e estragar em silêncio.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone A mensagem de erro — leia com calma

ERROR: insert or update on table "jogo" violates foreign key
constraint "jogo_id_plataforma_fkey"
DETAIL: Key (id_plataforma)=(7) is not present in table "plataforma".
Trecho Quer dizer
violates foreign key constraint quebra a regra de chave estrangeira
is not present in table não existe na tabela

A linha DETAIL diz exatamente qual valor e qual tabela. Leia ela.

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Checagem do Bloco 1

CREATE TABLE emprestimo (
    id_emprestimo SERIAL PRIMARY KEY,
    id_cliente    INTEGER REFERENCES cliente(id_cliente),
    id_jogo       INTEGER REFERENCES jogo(id_jogo),
    data_retirada DATE NOT NULL
);
  • Quantas chaves estrangeiras essa tabela tem? Por quê?
  • O que acontece se eu inserir id_cliente = 500 sem esse cliente existir?
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Intervalo

10 minutos

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Bloco 2

As outras constraints

icone NOT NULLnunca vazio
icone UNIQUEnão pode repetir
icone CHECKa regra de negócio no banco
icone DEFAULTo valor que entra sozinho
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone Constraint, em uma frase

Constraint é uma regra que o banco faz valer. Se o dado não obedece, o banco recusa — e o dado errado nunca entra.
EN PT
constraint restrição — a regra que o banco faz valer

Regra que está só na cabeça do atendente não é constraint.
Regra que está no banco, é.

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone NOT NULL — nunca vazio

nome VARCHAR(100) NOT NULL
  • Vem direto da coluna "Obrigatório?" do dicionário de dados (Aula 04)
  • Sem ele, alguém cadastra um cliente sem nome — e ninguém descobre até o relatório
Lembrem da Aula 04: NULL é "não sei", não é zero nem texto vazio. NOT NULL diz que "não sei" é inaceitável naquela coluna.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone UNIQUE — não pode repetir

email VARCHAR(120) UNIQUE
cpf   VARCHAR(11)  NOT NULL UNIQUE
  • Garante que não existem dois clientes com o mesmo e-mail
  • É a chave candidata da Aula 05 finalmente virando regra
UNIQUE e PRIMARY KEY não são a mesma coisa: PRIMARY KEY é única E nunca vazia, e só pode haver uma por tabela. UNIQUE pode haver várias, e aceita nulo.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone CHECK — a regra de negócio no banco

ano_lancamento INTEGER CHECK (ano_lancamento > 1970),
preco_diaria   NUMERIC(10,2) CHECK (preco_diaria >= 0),
data_prevista  DATE NOT NULL CHECK (data_prevista >= data_retirada)
EN PT
CHECK verificar — o valor precisa satisfazer a condição
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone DEFAULT — o valor que entra sozinho

data_cadastro  DATE    DEFAULT CURRENT_DATE,
ativo          BOOLEAN DEFAULT TRUE,
quantidade     INTEGER DEFAULT 1
EN PT
DEFAULT padrão — o valor usado quando ninguém informa
CURRENT_DATE data atual — o dia de hoje, segundo o banco
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Onde cada decisão do papel vira constraint

No papel No SQL
* chave primária (A05) PRIMARY KEY
CE/FK → tabela (A07) REFERENCES tabela(coluna)
"Obrigatório: sim" (A04) NOT NULL
chave candidata (A05) UNIQUE
regra do minimundo (A03) CHECK (...)
Nove aulas de papel, cinco linhas de tradução. Foi para isso que a gente fez tudo aquilo.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Checagem do Bloco 2

Que constraint você usaria?

  • O CPF do cliente não pode repetir
  • O nome do jogo não pode ficar vazio
  • A nota da avaliação vai de 0 a 5
  • A data de cadastro é a de hoje, se ninguém informar
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Intervalo

10 minutos

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Bloco 3

Ordem de criação e conserto sem recomeçar

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone A ordem importa

A ordem de criacao das tabelas: primeiro as que nao tem chave estrangeira, depois as que apontam para elas

Uma tabela com REFERENCES só pode ser criada depois da tabela referenciada. Criar jogo antes de plataforma dá erro.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone ON DELETE — o que fazer quando o pai some

Apagar uma plataforma que tem jogos: o que deve acontecer?

Opção Comportamento
ON DELETE RESTRICT (padrão) recusa apagar enquanto houver jogos ligados
ON DELETE CASCADE apaga a plataforma e todos os jogos dela
ON DELETE SET NULL apaga a plataforma e deixa os jogos sem plataforma
No curso usamos o padrão (RESTRICT). CASCADE é perigoso: um DELETE distraído pode levar meio banco junto.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone ALTER TABLE — consertar sem recomeçar

ALTER TABLE jogo ADD COLUMN ano_lancamento INTEGER;

ALTER TABLE jogo ALTER COLUMN titulo SET NOT NULL;

ALTER TABLE jogo
    ADD CONSTRAINT jogo_plataforma_fk
    FOREIGN KEY (id_plataforma) REFERENCES plataforma(id_plataforma);
Esqueceu uma coluna? Esqueceu um NOT NULL? Não precisa apagar a tabela e recomeçar. ALTER TABLE resolve.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

icone Erro comum — apagar tudo e recomeçar

A tentação de resolver qualquer erro com DROP TABLE e recriar é grande — e funciona hoje, porque o banco está vazio. A partir da Aula 12, não funciona mais: vocês vão perder os dados.

Peguem o hábito certo agora: erro de estrutura se conserta com ALTER.

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Checagem do Bloco 3

  • Em que ordem você criaria: emprestimo, cliente, jogo, plataforma?
  • O que acontece, por padrão, se você apagar um cliente que tem empréstimos?
  • Esqueceu o NOT NULL no titulo. Como conserta sem apagar a tabela?
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Intervalo

10 minutos

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Criar todas as tabelas do projeto

  1. Abram o .sql da Aula 10 e o esquema normalizado da Aula 09
  2. No papel, escrevam a ordem de criação das tabelas do grupo
  3. Criem as tabelas que faltam, nessa ordem, com todas as constraints
  4. Cada chave estrangeira com REFERENCES tabela(coluna)
  5. A tabela do meio do N:N por último
  6. Testem a integridade: tentem inserir uma FK que não existe e leiam o erro
  7. Salvem o .sql completo e entreguem
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Lembrete de entrega

Padrão Hoje
grupoNN-aulaNN-artefato.<ext> grupo03-aula11-criar-tabelas.sql
Um arquivo .sql com todos os CREATE TABLE, na ordem certa. Esse arquivo é o que permite recriar o banco do zero — e é ele que salva vocês se alguma coisa der errado até a Aula 18.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Enquanto vocês criam

O que eu vou conferir:

  • As tabelas foram criadas na ordem certa?
  • Toda FK tem REFERENCES apontando para a tabela e coluna certas?
  • As colunas obrigatórias do dicionário têm NOT NULL?
  • Existe pelo menos um CHECK vindo de uma regra do minimundo?
  • O grupo viu o erro de integridade acontecer na tela?
  • O número de tabelas bate com o esquema da Aula 09?
Terminou? Escreva um CHECK a mais, vindo de uma regra de negócio do seu projeto. Depois ajude o grupo do lado.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Devolutiva — passo de mesa em mesa

Eu passo em cada grupo. Deixem na tela:

  • O erro de integridade acontecendo, com a mensagem traduzida
  • O DER ao lado, apontando qual linha do desenho aquele erro está defendendo
A segunda parte é a que importa: a linha que vocês desenharam na Aula 06 virou uma regra que o banco defende sozinho.
Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Antes da próxima aula

Testar em casa: no seu banco pessoal, tente apagar uma linha que tem outras apontando para ela. Leia a mensagem de erro — é o ON DELETE RESTRICT trabalhando.

Tarefa opcional: acrescente um CHECK a mais no banco do projeto, vindo de uma regra do minimundo que vocês escreveram lá na Aula 03.

Para treinar: locadora-exercicios-11-constraints.sql, na página da aula — nove tentativas de quebrar as regras, e uma pegadinha com dois nulos.

Aula 11 · 22/10/2026 · Indicadores 3, 4
UC2 · Implementar Banco de Dados

Para a próxima aula

O banco está completo e vazio. Como colocar dados dentro — e como fazer isso a partir de um programa em Python?

Aula 11 · 22/10/2026 · Indicadores 3, 4
← todas as aulas