Tabelas e Relacionamentos no MySQL

Banco de Dados  ·  MySQL

Criando Tabelas Relacionadas no MySQL

Aprenda passo a passo como criar e conectar tabelas usando PRIMARY KEY, FOREIGN KEY e ALTER TABLE — do zero, de forma simples e didática.

 Nível Iniciante  MySQL / MariaDB  DDL + DML  Prof. Elton Alex Silva
Visão Geral do Modelo

Vamos criar um banco de dados com três tabelas que se relacionam em cadeia: cada time pertence a uma cidade, e cada cidade pertence a um estado (UF).

🗂️ uf
🔑 id_uf (PK)
sigla
nome
──▶
🏙️ cidades
🔑 id_cidade (PK)
nome
🔗 id_uf (FK)
──▶
⚽ clubes
🔑 id_clube (PK)
nome
fundacao
🔗 id_cidade (FK)
1
Criando o Banco de Dados

Antes de qualquer coisa, precisamos criar um "espaço" para guardar nossas tabelas. Pense no banco de dados como uma pasta no computador — tudo vai ficar organizado dentro dela.

SQL
-- Cria o banco de dados
CREATE DATABASE times_brasileiros;

-- "Entra" no banco para trabalhar dentro dele
USE times_brasileiros;
2
Criando as Tabelas (sem relacionamentos)

Vamos criar as três tabelas primeiro, apenas com suas colunas. Os relacionamentos serão adicionados depois, no Passo 4.

Tabela: uf
CREATE TABLE uf (
    id_uf   INT         NOT NULL AUTO_INCREMENT,
    sigla   VARCHAR(2)  NOT NULL,
    nome    VARCHAR(50) NOT NULL,
    PRIMARY KEY (id_uf)
);
Tabela: cidades
CREATE TABLE cidades (
    id_cidade INT          NOT NULL AUTO_INCREMENT,
    nome      VARCHAR(100) NOT NULL,
    id_uf     INT          NOT NULL,  -- vai apontar para a tabela uf
    PRIMARY KEY (id_cidade)
);
Tabela: times
CREATE TABLE times (
    id_time   INT          NOT NULL AUTO_INCREMENT,
    nome      VARCHAR(100) NOT NULL,
    fundacao  YEAR,
    id_cidade INT          NOT NULL,  -- vai apontar para a tabela cidades
    PRIMARY KEY (id_time)
);
3
PRIMARY KEY e AUTO_INCREMENT
🔑
PRIMARY KEY
Identifica cada linha da tabela de forma única. Nenhuma outra linha pode ter o mesmo valor. É o "número de matrícula" do registro.
AUTO_INCREMENT
O MySQL gera o próximo número automaticamente. Você não precisa informar o ID no INSERT — ele sempre cria o próximo disponível.
🚫
NOT NULL
A coluna é obrigatória. O banco de dados não aceita inserir uma linha sem esse campo preenchido.
Imagine uma lista de alunos na escola. Se dois alunos se chamam "João Silva", como o sistema os diferencia? Pelo número de matrícula único — que é exatamente o papel da PRIMARY KEY.
Como o AUTO_INCREMENT funciona
-- Você insere assim (sem informar o id):
INSERT INTO uf (sigla, nome) VALUES ('SP', 'São Paulo');
INSERT INTO uf (sigla, nome) VALUES ('RJ', 'Rio de Janeiro');
INSERT INTO uf (sigla, nome) VALUES ('MG', 'Minas Gerais');

-- E o banco cria automaticamente:
-- id_uf=1 → SP
-- id_uf=2 → RJ
-- id_uf=3 → MG
4
Adicionando Relacionamentos com FOREIGN KEY

Agora vamos ligar as tabelas entre si usando o comando ALTER TABLE (que modifica uma tabela existente) combinado com FOREIGN KEY.

Relacionamento: cidades → uf
-- O campo id_uf de "cidades" deve existir em "uf"
ALTER TABLE cidades
    ADD CONSTRAINT fk_cidades_uf        -- nome da constraint
    FOREIGN KEY (id_uf)                 -- coluna nesta tabela
    REFERENCES uf (id_uf);              -- tabela e coluna de referência
Relacionamento: times → cidades
-- O campo id_cidade de "times" deve existir em "cidades"
ALTER TABLE times
    ADD CONSTRAINT fk_times_cidades     -- nome da constraint
    FOREIGN KEY (id_cidade)             -- coluna nesta tabela
    REFERENCES cidades (id_cidade);     -- tabela e coluna de referência
5
O que é FOREIGN KEY e por que ela é importante?
Definição Simples

A FOREIGN KEY (Chave Estrangeira) é uma ponte entre duas tabelas. Ela diz ao banco de dados: "o valor nesta coluna precisa existir na outra tabela — se não existir, não aceita!"

A FOREIGN KEY age como um guarda de segurança: antes de aceitar o dado novo, ela verifica se a referência existe. Sem ela, o banco aceitaria, por exemplo, um time cadastrado em uma cidade inexistente — gerando dados inválidos.
🛡️
Integridade Referencial
Garante que os dados estejam sempre consistentes. Um filho não pode existir sem seu pai.
🚫
Sem Dados Órfãos
Impede registros que apontam para IDs inexistentes — os chamados "dados órfãos".
🔗
Relação Pai → Filho
uf é pai de cidades, que é pai de times. O INSERT deve seguir essa ordem.
6
Inserindo Dados com INSERT
Regra de Ouro

Sempre insira na ordem certa — do pai para o filho. Insira primeiro em uf, depois em cidades, e por último em times.

1º — Inserindo estados
INSERT INTO uf (sigla, nome) VALUES ('SP', 'São Paulo');       -- id_uf = 1
INSERT INTO uf (sigla, nome) VALUES ('RJ', 'Rio de Janeiro');   -- id_uf = 2
INSERT INTO uf (sigla, nome) VALUES ('MG', 'Minas Gerais');     -- id_uf = 3
2º — Inserindo cidades
INSERT INTO cidades (nome, id_uf) VALUES ('São Paulo',      1); -- id_cidade=1, SP
INSERT INTO cidades (nome, id_uf) VALUES ('Campinas',       1); -- id_cidade=2, SP
INSERT INTO cidades (nome, id_uf) VALUES ('Rio de Janeiro', 2); -- id_cidade=3, RJ
INSERT INTO cidades (nome, id_uf) VALUES ('Belo Horizonte', 3); -- id_cidade=4, MG
3º — Inserindo times
INSERT INTO times (nome, fundacao, id_cidade)
VALUES ('Corinthians',      1910, 1), -- São Paulo/SP
       ('Palmeiras',         1914, 1), -- São Paulo/SP
       ('Ponte Preta',       1900, 2), -- Campinas/SP
       ('Flamengo',          1895, 3), -- Rio de Janeiro/RJ
       ('Fluminense',        1902, 3), -- Rio de Janeiro/RJ
       ('Atletico Mineiro',  1908, 4); -- Belo Horizonte/MG
7
Erro de Integridade Referencial

Agora vamos ver o que acontece quando tentamos quebrar a regra da chave estrangeira, inserindo uma referência que não existe.

Teste de erro — referência inválida
-- ERRO: tentando inserir cidade com id_uf = 99 (não existe em uf)
INSERT INTO cidades (nome, id_uf) VALUES ('Cidade Fantasma', 99);

-- ERRO: tentando inserir time com id_cidade = 50 (não existe em cidades)
INSERT INTO times (nome, fundacao, id_cidade) VALUES ('Time Fantasma', 2000, 50);
Resposta do MySQL
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`times_brasileiros`.`cidades`, CONSTRAINT `fk_cidades_uf` FOREIGN KEY (`id_uf`) REFERENCES `uf` (`id_uf`))
Traduzindo o erro
"Você está tentando inserir uma cidade que pertence ao estado de id 99, mas esse estado não existe na tabela uf. Operação negada."

Isso é exatamente o comportamento esperado — a FOREIGN KEY está fazendo seu trabalho de proteger a consistência dos dados.
8
Bônus: ON DELETE CASCADE e ON DELETE SET NULL

O que acontece se você deletar um registro pai? Temos duas estratégias para controlar esse comportamento.

💥
ON DELETE CASCADE
Se o pai for deletado, todos os filhos são deletados automaticamente junto.

"Apaga pasta com arquivos dentro."
🔲
ON DELETE SET NULL
Se o pai for deletado, os filhos continuam existindo, mas a referência vira NULL (vazio).

"Funcionário sem filial definida."
ON DELETE CASCADE
-- Primeiro remove a constraint antiga
ALTER TABLE cidades DROP FOREIGN KEY fk_cidades_uf;

-- Recria com CASCADE: deletar um estado apaga suas cidades automaticamente
ALTER TABLE cidades
    ADD CONSTRAINT fk_cidades_uf
    FOREIGN KEY (id_uf)
    REFERENCES uf (id_uf)
    ON DELETE CASCADE;

-- Ao deletar SP (id_uf=1), as cidades São Paulo e Campinas
-- serão deletadas automaticamente junto!
DELETE FROM uf WHERE id_uf = 1;
ON DELETE SET NULL
-- Recria com SET NULL: deletar cidade deixa os times sem cidade
ALTER TABLE times DROP FOREIGN KEY fk_times_cidades;

ALTER TABLE times
    MODIFY id_cidade INT NULL,    -- precisa permitir NULL
    ADD CONSTRAINT fk_times_cidades
    FOREIGN KEY (id_cidade)
    REFERENCES cidades (id_cidade)
    ON DELETE SET NULL;

-- Se a cidade for deletada, os times continuam no banco
-- mas com id_cidade = NULL (sem cidade associada)
✅ Resumo dos Conceitos
Conceito O que faz Analogia
PRIMARY KEY Identifica cada linha de forma única Número de matrícula
AUTO_INCREMENT Gera o próximo ID automaticamente Senha de banco que avança
FOREIGN KEY Garante que a referência existe na outra tabela Guarda de segurança
ALTER TABLE Modifica uma tabela já existente Reformar uma sala depois de construída
ON DELETE CASCADE Apaga os filhos junto com o pai Apagar pasta com arquivos
ON DELETE SET NULL Mantém os filhos, mas sem referência Funcionário sem filial
Conclusão

Seguindo essa estrutura, seu banco de dados garante que nenhuma cidade existe sem um estado válido e nenhum time existe sem uma cidade válida. Seus dados serão sempre consistentes e confiáveis — esse é o poder dos relacionamentos com chaves estrangeiras!

Comentários

Postagens mais visitadas deste blog

Introdução aos Sistemas de Gerenciamento de Banco de Dados

Introdução ao HTML, CSS e JavaScript - Guia para Iniciantes

Introdução ao Excel