Uma chave primária identifica unicamente cada linha em uma tabela; uma chave estrangeira referencia a chave primária de outra tabela, estabelecendo um relacionamento entre tabelas e aplicando integridade referencial (você não pode referenciar uma linha que não existe).
Chave primária — identificador único de linha
CREATE TABLE users (
id INT PRIMARY KEY, -- uniquely identifies each user (unique + not null)
name VARCHAR(100),
email VARCHAR(255) UNIQUE
);
-- often auto-generated: id SERIAL PRIMARY KEY (Postgres) / AUTO_INCREMENT (MySQL)
Uma chave primária é única e não nula — ela identifica cada linha. É automaticamente indexada (buscas rápidas) e é o que as chaves estrangeiras referenciam.
Chave estrangeira — referencia outra tabela
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
total DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id) -- user_id must match a users.id
);
Uma chave estrangeira (user_id) referencia a chave primária de outra tabela (users.id), criando o relacionamento "um pedido pertence a um usuário". O banco de dados força isso: você não pode inserir um pedido com um user_id que não existe em users.
Integridade referencial (o benefício principal)
INSERT INTO orders (user_id, total) VALUES (999, 50); -- ❌ ERROR if user 999 doesn't exist
-- the foreign key PREVENTS orphaned records (orders referencing non-existent users)
Integridade referencial significa que o banco de dados garante que os relacionamentos são válidos — você não pode ter um pedido referenciando um usuário inexistente. Isso evita corrupção de dados de referências órfãs/inválidas.
Comportamento ON DELETE / ON UPDATE
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE -- delete the user → delete their orders too
-- ON DELETE SET NULL -- set user_id to NULL
-- ON DELETE RESTRICT -- prevent deleting a user who has orders (default-ish)
ON DELETE/ON UPDATE definem o que acontece com linhas dependentes quando a linha referenciada é deletada ou alterada — CASCADE (propagar), SET NULL, ou RESTRICT (impedir). Escolher corretamente é importante para evitar perda de dados acidental ou linhas órfãs.
Por que isso importa
Chaves primárias e estrangeiras são fundamentais para o design de banco de dados relacional — elas são como o modelo relacional estabelece identidade e relacionamentos entre tabelas, então compreendê-las é essencial para projetar e trabalhar com qualquer banco de dados relacional. Chaves primárias (identificando unicamente cada linha, auto-indexadas) são a base da identidade da tabela e o que os relacionamentos referenciam. Chaves estrangeiras estabelecem os relacionamentos entre tabelas (pedidos pertencem a usuários, etc.) que definem a estrutura relacional dos dados de uma aplicação.
Criticamente, chaves estrangeiras aplicam integridade referencial — o banco de dados garante que os relacionamentos são válidos (você não pode referenciar uma linha inexistente), o que evita corrupção de dados de referências órfãs ou inválidas, um grande benefício de confiabilidade que mantém a consistência dos dados automaticamente.
Compreender os comportamentos ON DELETE/ON UPDATE (CASCADE, SET NULL, RESTRICT) é importante porque determinam o que acontece aos dados relacionados quando uma linha referenciada muda ou é deletada — escolher corretamente evita perda de dados acidental (por exemplo, CASCADE deletando mais que o pretendido) ou registros órfãos, uma decisão de design consequente.
Como os relacionamentos entre tabelas são a essência dos bancos de dados relacionais, e como chaves primárias/estrangeiras (e integridade referencial) são como esses relacionamentos são definidos e protegidos, compreendê-las — chaves para identidade e relacionamentos, integridade referencial para consistência de dados, e os comportamentos on-delete para gerenciar dados relacionados — é conhecimento fundamental, essencial para o design de banco de dados e um tópico comum de entrevista indispensável para trabalhar corretamente com dados relacionais.
