← Voltar para 1. Identificadores & Chaves
1. Identificadores & Chaves

INT UNSIGNED AUTO_INCREMENT

Chave primária numérica sequencial padrão (1, 2, 3...) ideal para a maioria das tabelas relacionais.

💾 Espaço em Disco: 4 Bytes (32 bits) 📏 Limites: De 1 até 4.294.967.295 (Unsigned) ou até 2.147.483.647 (Signed)

O tipo INT UNSIGNED AUTO_INCREMENT (ou SERIAL no PostgreSQL) gera automaticamente um número inteiro único e sequencial a cada novo registro inserido. Por ocupar apenas 4 bytes e ser inserido em ordem crescente, o índice B-Tree da chave primária permanece extremamente rápido e sem fragmentação em disco.

✅ Quando Usar

  • •Chave primária (id) de tabelas com até ~2 bilhões de registros (usuários, produtos, categorias, clientes).
  • •Chaves estrangeiras (usuario_id, categoria_id) que apontam para tabelas com PK do tipo INT.
  • •Sistemas internos onde o ID sequencial rápido melhora a performance de JOINs.

🚫 Quando NÃO Usar

  • •Tabelas de altíssimo volume que podem ultrapassar 4 bilhões de linhas (logs, eventos de IoT, transações financeiras globais) — nesses casos, use BIGINT.
  • •URLs públicas sensíveis onde você não quer que concorrentes descubram quantos clientes ou pedidos você tem (ex: /pedido/105 vs /pedido/106) — combine com um UUID público.

📐 Configuração no DrawDB

Type:
INT (ou INTEGER)
Size / Values:
Deixe em branco (não use INT(11), pois no MySQL 8+ o display width foi depreciado)
Default:
Vazio (o banco gera automaticamente via Auto Increment)
MySQL / MariaDB
INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
PostgreSQL
SERIAL PRIMARY KEY (ou INT GENERATED ALWAYS AS IDENTITY)
SQLite
INTEGER PRIMARY KEY AUTOINCREMENT
🗄️ SQL DDL (Pronto para Importar no DrawDB)
CREATE TABLE categorias (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nome VARCHAR(80) NOT NULL
);

CREATE TABLE produtos (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    categoria_id INT UNSIGNED NOT NULL,
    nome VARCHAR(120) NOT NULL,
    CONSTRAINT fk_produtos_categoria
        FOREIGN KEY (categoria_id) REFERENCES categorias(id)
        ON DELETE RESTRICT ON UPDATE CASCADE
);
🐘 Exemplo Prático em PHP 8 + PDO
<?php
declare(strict_types=1);

// 1. Inserindo registro sem informar o ID (o banco gera via AUTO_INCREMENT)
$stmt = $pdo->prepare('INSERT INTO categorias (nome) VALUES (:nome)');
$stmt->bindValue(':nome', 'Eletrônicos', PDO::PARAM_STR);
$stmt->execute();

// 2. Recuperando o ID gerado pelo banco convertendo para int do PHP
$novoId = (int) $pdo->lastInsertId();
echo "Categoria criada com ID: {$novoId}\n";

// 3. Buscando por ID com validação e PDO::PARAM_INT
$idBusca = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if ($idBusca === false || $idBusca === null || $idBusca <= 0) {
    throw new InvalidArgumentException('ID inválido.');
}

$stmt = $pdo->prepare('SELECT id, nome FROM categorias WHERE id = :id');
$stmt->bindValue(':id', $idBusca, PDO::PARAM_INT);
$stmt->execute();
$categoria = $stmt->fetch(PDO::FETCH_ASSOC);