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