Tabelas e Relacionamentos no 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.
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).
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.
-- Cria o banco de dados CREATE DATABASE times_brasileiros; -- "Entra" no banco para trabalhar dentro dele USE times_brasileiros;
Vamos criar as três tabelas primeiro, apenas com suas colunas. Os relacionamentos serão adicionados depois, no Passo 4.
CREATE TABLE uf ( id_uf INT NOT NULL AUTO_INCREMENT, sigla VARCHAR(2) NOT NULL, nome VARCHAR(50) NOT NULL, PRIMARY KEY (id_uf) );
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) );
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) );
-- 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
Agora vamos ligar as tabelas entre si usando o comando ALTER TABLE (que modifica uma tabela existente) combinado com FOREIGN KEY.
-- 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
-- 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
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!"
Sempre insira na ordem certa — do pai para o filho. Insira primeiro em uf, depois em cidades, e por último em times.
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
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
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
Agora vamos ver o que acontece quando tentamos quebrar a regra da chave estrangeira, inserindo uma referência que não existe.
-- 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);
Isso é exatamente o comportamento esperado — a FOREIGN KEY está fazendo seu trabalho de proteger a consistência dos dados.
O que acontece se você deletar um registro pai? Temos duas estratégias para controlar esse comportamento.
"Apaga pasta com arquivos dentro."
"Funcionário sem filial definida."
-- 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;
-- 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)
| 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 |
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
Postar um comentário
Ficou com alguma dúvida? Quer compartilhar sua experiência? Tem uma sugestão de
melhoria? Seu comentário é muito importante!