Chaves primárias e unicidade
Entenda chaves primárias, chaves substitutas e naturais, chaves compostas e por que toda linha precisa de um identificador único em que você possa confiar.
Chaves primárias e unicidade é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Por que toda linha precisa de um ID exclusivo
Para atualizar ou excluir uma linha específica com segurança, você precisa conseguir apontar para ela sem ambiguidades.
- Podem existir dois usuários chamados "Alice Adams"
- Mas não podem existir dois usuários com
id = 42 - O identificador exclusivo é chamado de chave primária
Declarando uma chave primária
Você marca uma coluna como chave primária ao criar a tabela:
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
sku VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
price NUMERIC(10,2) NOT NULL
);Chave primária = NOT NULL + UNIQUE
Uma PRIMARY KEY impõe automaticamente:
- NOT NULL — os valores da chave primária não podem estar ausentes
- UNIQUE — duas linhas não podem compartilhar o mesmo valor de chave primária
O banco de dados também cria um índice exclusivo na chave primária, portanto as buscas por ID são rápidas.
Chaves substitutas versus naturais
Você tem duas opções para a chave primária:
- Substituta — um ID sintético gerado pelo banco de dados (BIGSERIAL, UUID). É a opção mais comum em aplicativos modernos.
- Natural — um identificador do mundo real (e-mail, ISBN). É arriscado: as pessoas mudam de endereço de e-mail.
Boa prática: use um ID substituto e coloque uma restrição UNIQUE na chave natural.
BIGSERIAL: inteiros com incremento automático
No PostgreSQL, BIGSERIAL cria uma coluna de 64 bits com incremento automático, apoiada por uma sequência.
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
total NUMERIC(10,2) NOT NULL
);
-- You omit id on insert and the DB fills it in:
INSERT INTO orders (user_id, total) VALUES (7, 99.50);Chaves primárias UUID
Uma alternativa é um UUID de 128 bits, útil quando os IDs precisam ser exclusivos entre sistemas ou ser gerados no lado do cliente.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id BIGINT NOT NULL,
ip INET
);Chaves primárias compostas
Às vezes, o identificador natural é uma combinação de colunas:
CREATE TABLE order_items (
order_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity INT NOT NULL,
PRIMARY KEY (order_id, product_id)
);
-- The pair (order_id, product_id) must be unique
-- A product can appear at most once per orderRestrições UNIQUE versus chave primária
Você pode declarar outras colunas como exclusivas sem torná-las a chave primária:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
username VARCHAR(50) UNIQUE
);
-- INSERT below fails on the second row:
INSERT INTO users (email, username) VALUES ('a@x.com', 'alice');
INSERT INTO users (email, username) VALUES ('a@x.com', 'bob'); -- ERRORO que acontece em uma inserção duplicada
Se você tentar inserir uma chave primária duplicada, o banco de dados rejeitará toda a instrução:
ERROR: duplicate key value violates unique constraint "users_pkey" DETAIL: Key (id)=(42) already exists.
Isso é bom — impede a corrupção silenciosa dos dados.
Consultar linhas pela chave primária é rápido
O índice exclusivo na chave primária fornece buscas O(log n), mesmo em uma escala de bilhões de linhas.
-- Index Scan using users_pkey on users (cost=0.43..8.45 rows=1)
SELECT email FROM users WHERE id = 42;Não reutilize IDs
Mesmo quando você exclui uma linha, NÃO reutilize sua chave primária. Outras tabelas ou sistemas externos ainda podem fazer referência a ela. Deixe a sequência continuar aumentando — IDs são baratos.
Recapitulação
As chaves primárias fornecem a cada linha uma referência estável e exclusiva.
- Prefira chaves substitutas (BIGSERIAL ou UUID)
- Use UNIQUE para chaves naturais que não podem ser duplicadas
- Chaves primárias compostas representam a regra "este par deve ser exclusivo"
Verificação rápida
O que é imposto implicitamente por uma PRIMARY KEY?
Perguntas Frequentes
A aula “Chaves primárias e unicidade” é grátis?
Sim — o texto completo de “Chaves primárias e unicidade” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Chaves primárias e unicidade”?
Entenda chaves primárias, chaves substitutas e naturais, chaves compostas e por que toda linha precisa de um identificador único em que você possa confiar. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Chaves primárias e unicidade”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- O que é um RDBMS e por que as tabelas são importantes
- Chaves primárias e unicidade
- NULL: o terceiro valor lógico
- Visão geral dos tipos de dados: INT VARCHAR DATE BOOLEAN