← Voltar ao blog

Firebird: Generators e Sequences — como implementar auto-increment

Firebird não tem AUTOINCREMENT: usa generator (sequence) com trigger ou RETURNING. Veja como criar, usar e sincronizar sem quebrar a chave primária.


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

  1. Gaps nos IDs: generators não são transacionais — se um INSERT falhar (rollback), o número já foi consumido. Isso é normal e esperado.
  2. Concurrency: generators são atômicos e thread-safe. Múltiplas conexões podem chamar GEN_ID sem conflito.
  3. 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.