No capítulo anterior, criamos a tabela produtos e deixamos uma brecha proposital. Vamos testá-la agora.
Execute isso no Query Tool:
INSERT INTO produtos (id, nome, preco, estoque, categoria)
VALUES (1, 'Teclado Mecânico', 299.90, 15, 'Periféricos');
INSERT INTO produtos (id, nome, preco, estoque, categoria)
VALUES (1, 'Mouse Gamer', 189.90, 30, 'Periféricos');
O Postgres aceitou os dois, sem reclamar. Agora rode:
SELECT * FROM produtos WHERE id = 1;
Duas linhas voltaram. Dois produtos completamente diferentes, com o mesmo id. Se você pedir "me dá o produto de id 1", o banco não tem como saber qual dos dois você quer.
Isso é um problema sério — e é exatamente o que vamos resolver agora.
No Modelo Entidade-Relacionamento, toda entidade precisa de um atributo (ou conjunto de atributos) que a identifique de forma única. Esse atributo se chama chave primária (**P**rimary **K**ey).
graph TD
A["Entidade: Produto"] --> B["🔑 id (chave primária)"]
A --> C["nome"]
A --> D["preco"]
A --> E["estoque"]
style B fill:#f59e0b,color:#fff
No diagrama, a chave primária costuma vir marcada com um símbolo de chave (🔑) ou sublinhada, justamente pra deixar claro: esse atributo, e só ele, garante que cada linha seja única.
No SQL, isso vira a constraint PRIMARY KEY. Vamos recriar a tabela produtos, agora corretamente:
-- Apagando a tabela anterior para recomeçar do zero
DROP TABLE produtos;
CREATE TABLE produtos (
id SERIAL PRIMARY KEY,
nome VARCHAR(100),
preco DECIMAL(10,2),
estoque INTEGER,
categoria VARCHAR(50)
);
id SERIAL PRIMARY KEYDuas coisas acontecendo aqui:
SERIAL continua gerando o número automaticamentePRIMARY KEY diz ao Postgres: "esse valor nunca pode se repetir, e nunca pode ficar vazio"Agora teste de novo:
INSERT INTO produtos (id, nome, preco, estoque, categoria)
VALUES (1, 'Teclado Mecânico', 299.90, 15, 'Periféricos');
INSERT INTO produtos (id, nome, preco, estoque, categoria)
VALUES (1, 'Mouse Gamer', 189.90, 30, 'Periféricos');
Dessa vez, o Postgres recusa a segunda inserção:
❌ ERROR: duplicate key value violates unique constraint "produtos_pkey"