🎬 Introdução

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.


🧠 O Conceito no Modelo ER: Chave Primária

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.


🔑 Traduzindo para o PostgreSQL: PRIMARY KEY

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)
);

📖 Explicação

id SERIAL PRIMARY KEY

Duas coisas acontecendo aqui:

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"