Firebird não tem AUTO_INCREMENT como MySQL. Em vez disso, usa generators (ou sequences). Entenda como funcionam e como usá-los corretamente.
O que é um generator
Um generator é um contador atômico armazenado no banco. Cada chamada a GEN_ID() incrementa e retorna o valor.
Criar um generator
CREATE GENERATOR gen_clientes_id;
SET GENERATOR gen_clientes_id TO 0;
Usar em INSERT
INSERT INTO clientes (id, nome)
VALUES (GEN_ID(gen_clientes_id, 1), 'João Silva');
Generator em trigger (recomendado)
A melhor prática é usar um trigger BEFORE INSERT:
CREATE TRIGGER trg_clientes_id FOR clientes
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.id IS NULL) THEN
NEW.id = GEN_ID(gen_clientes_id, 1);
END
Assim, o INSERT fica simples:
INSERT INTO clientes (nome) VALUES ('João Silva');
Sequences (Firebird 2.0+)
Firebird 2.0 introduziu a sintaxe padrão SQL:
CREATE SEQUENCE seq_clientes;
SELECT NEXT VALUE FOR seq_clientes FROM RDB$DATABASE;
Armadilhas comuns
- Gaps nos IDs: generators não são transacionais — se um INSERT falhar (rollback), o número já foi consumido. Isso é normal e esperado.
- Concurrency: generators são atômicos e thread-safe. Múltiplas conexões podem chamar GEN_ID sem conflito.
- Backup/restore: generators são restaurados com o valor atual no backup.
Dica de performance
Para tabelas com alto volume de INSERT, evite chamar GEN_ID por linha em loops. Use um único generator e atribua em batch.
Precisa gerar triggers e generators para suas tabelas? Descreva a estrutura em português no Sqlify e receba o DDL pronto.
Conclusão
Generators são a forma Firebird de auto-increment. Use triggers BEFORE INSERT para manter o código limpo e os IDs consistentes.