This post is also available in:
Você precisa recriar um ambiente de testes, desfazer uma carga de dados ou simplesmente reiniciar a numeração de uma sequence. Qualquer que seja o motivo, resetar uma sequence no Oracle é uma operação comum — e que tem dois caminhos bem diferentes dependendo da versão do seu banco.
Este post mostra os dois métodos, explica o impacto do CACHE, como verificar dependências antes de agir, e como resetar para um valor específico (não só para 1).
Antes de Resetar: Verifique as Dependências
Resetar uma sequence vinculada a uma chave primária pode gerar conflitos de unicidade. Antes de qualquer coisa, verifique:
-- Sequences usadas como DEFAULT em colunas
SELECT
t.owner,
t.table_name,
t.column_name,
t.data_default
FROM dba_tab_columns t
WHERE UPPER(t.data_default) LIKE '%SEQ%'
AND t.owner = 'SEU_SCHEMA';
-- Identity columns vinculadas a sequences internas
SELECT
owner,
table_name,
column_name,
identity_column,
default_on_null
FROM dba_tab_columns
WHERE identity_column = 'YES'
AND owner = 'SEU_SCHEMA';Se a sequence alimenta uma coluna com dados existentes na tabela, resetar para 1 vai colidir com os registros já inseridos. Nesse caso, resetar para um valor maior que o MAX atual é a saída correta.
Método Moderno: ALTER SEQUENCE … RESTART (Oracle 18c/19c+)
⚠️ Atenção: A cláusula
RESTARTfoi introduzida originalmente para uso interno da Oracle. Ela aparece na documentação oficial do Oracle 19c, mas use com consciência em produção — teste no seu ambiente antes.
A partir do Oracle 18c/19c, você pode reiniciar uma sequence diretamente:
-- Reinicia para o valor inicial (START WITH original)
ALTER SEQUENCE esquema.nome_sequence RESTART;
-- Reinicia para um valor específico
ALTER SEQUENCE esquema.nome_sequence RESTART START WITH 1000;O RESTART sem parâmetro volta ao START WITH original da sequence. Se quiser um valor diferente, use RESTART START WITH .
Para zerar o efeito do CACHE junto com o restart (evitar gaps por valores pré-alocados perdidos):
ALTER SEQUENCE esquema.nome_sequence RESTART START WITH 1 NOCACHE;
-- Depois, se quiser reativar o cache:
ALTER SEQUENCE esquema.nome_sequence CACHE 20;Método Clássico: INCREMENT BY Negativo (Oracle 12c e anteriores)
Este é o método que funciona em qualquer versão. Como o MINVALUE padrão de uma sequence é 1, não é possível simplesmente aplicar um INCREMENT BY negativo igual ao NEXTVAL atual — o Oracle rejeitaria com ORA-08004, pois o resultado passaria pelo 0. A solução é baixar o MINVALUE para 0 temporariamente.
-- 1. Descubra o valor atual
SELECT esquema.nome_sequence.NEXTVAL FROM dual;
-- Resultado exemplo: 27
-- 2. Baixe o MINVALUE para 0 e aplique o incremento negativo
ALTER SEQUENCE esquema.nome_sequence MINVALUE 0 INCREMENT BY -27 NOCACHE;
-- 3. Consuma um NEXTVAL para efetivar o recuo
SELECT esquema.nome_sequence.NEXTVAL FROM dual;
-- Retorna: 0
-- 4. Restaure o incremento (MINVALUE ainda está em 0 — não altere junto)
ALTER SEQUENCE esquema.nome_sequence INCREMENT BY 1;
-- 5. Confirme: próximo NEXTVAL é 1
SELECT esquema.nome_sequence.NEXTVAL FROM dual;
-- Retorna: 1
-- 6. Agora restaure o MINVALUE
ALTER SEQUENCE esquema.nome_sequence MINVALUE 1;Atenção ao CACHE: Se a sequence tem
CACHEativo, os valores pré-alocados na SGA são perdidos em caso de restart do banco ou flush do cache — gerando gaps na numeração. UseNOCACHEdurante o reset para ter previsibilidade no valor resultante e reative depois se necessário.
Ordem importa: Não tente restaurar
INCREMENT BY 1eMINVALUE 1no mesmo comando enquanto o valor atual for 0 — o Oracle rejeita com ORA-04007. Restaure o INCREMENT BY primeiro, consuma o NEXTVAL (que entrega 1), e só então ajuste o MINVALUE.
Para resetar para um valor específico (ex: 5000), a fórmula é valor_alvo - NEXTVAL_atual:
-- NEXTVAL atual: 27, alvo: 5000
-- 5000 - 27 = 4973
ALTER SEQUENCE esquema.nome_sequence MINVALUE 0 INCREMENT BY 4973 NOCACHE;
SELECT esquema.nome_sequence.NEXTVAL FROM dual;
ALTER SEQUENCE esquema.nome_sequence INCREMENT BY 1;Identity Columns: Caso Especial
Se a coluna usa GENERATED AS IDENTITY (introduzido no Oracle 12c), ela tem uma sequence interna gerenciada pelo próprio Oracle. O ALTER SEQUENCE direto não se aplica — use:
ALTER TABLE esquema.tabela
MODIFY (coluna GENERATED AS IDENTITY (START WITH 1));Ou para um valor específico:
ALTER TABLE esquema.tabela
MODIFY (coluna GENERATED AS IDENTITY (START WITH 5000));Cenário Completo de Lab
Setup
CREATE TABLE lab_pedidos (
id NUMBER PRIMARY KEY,
descr VARCHAR2(100)
);
CREATE SEQUENCE lab_seq START WITH 1 INCREMENT BY 1 CACHE 20;Popula dados iniciais
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido A');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido B');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido C');
COMMIT;
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 4Método Moderno — RESTART (19c+)
ALTER SEQUENCE lab_seq RESTART START WITH 1 NOCACHE;
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 1
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 2
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 3O RESTART entrega exatamente o valor definido no START WITH, sem surpresas.
Método Clássico — INCREMENT BY Negativo
Para demonstrar o método clássico, continue inserindo dados a partir do estado atual (NEXTVAL = 3 após o teste acima) até acumular um volume maior:
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido D');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido E');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido F');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido G');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido H');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido I');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido J');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido K');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido L');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido M');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido N');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido O');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido P');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido Q');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido R');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido S');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido T');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido U');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido V');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido W');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido X');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido Y');
INSERT INTO lab_pedidos VALUES (lab_seq.NEXTVAL, 'Pedido Z');
COMMIT;
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 27Agora o reset:
-- 1. Verifique o NEXTVAL atual
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 27
-- 2. Baixe o MINVALUE para 0 e aplique o incremento negativo
ALTER SEQUENCE lab_seq MINVALUE 0 INCREMENT BY -27 NOCACHE;
-- 3. Consuma um NEXTVAL para efetivar o recuo
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 0
-- 4. Restaure o INCREMENT BY
ALTER SEQUENCE lab_seq INCREMENT BY 1;
-- 5. Confirme o reset
SELECT lab_seq.NEXTVAL FROM dual;
-- Retorna: 1
-- 6. Restaure o MINVALUE
ALTER SEQUENCE lab_seq MINVALUE 1;Limpeza
DROP SEQUENCE lab_seq;
DROP TABLE lab_pedidos;Erros Conhecidos
ORA-08004: sequence NEXTVAL goes below MINVALUE and cannot be instantiated
Ocorre quando o INCREMENT BY negativo levaria o NEXTVAL abaixo do MINVALUE da sequence (padrão: 1). Aplicar INCREMENT BY -27 com NEXTVAL em 27 tentaria pousar em 0, violando o MINVALUE.
Solução: Baixe o MINVALUE para 0 antes de aplicar o incremento negativo:
ALTER SEQUENCE lab_seq MINVALUE 0 INCREMENT BY -27 NOCACHE;
SELECT lab_seq.NEXTVAL FROM dual; -- Retorna: 0
ALTER SEQUENCE lab_seq INCREMENT BY 1;
ALTER SEQUENCE lab_seq MINVALUE 1;ORA-04007: MINVALUE cannot be made to exceed the current value
Ocorre quando você tenta restaurar MINVALUE 1 enquanto o valor atual da sequence é 0. O Oracle não permite que o MINVALUE seja maior que o valor corrente.
Solução: Restaure o INCREMENT BY 1 primeiro e consuma um NEXTVAL (que entrega 1) antes de ajustar o MINVALUE:
-- ERRADO — falha com ORA-04007:
ALTER SEQUENCE lab_seq INCREMENT BY 1 MINVALUE 1;
-- CORRETO — faça em etapas:
ALTER SEQUENCE lab_seq INCREMENT BY 1;
SELECT lab_seq.NEXTVAL FROM dual; -- Retorna: 1
ALTER SEQUENCE lab_seq MINVALUE 1;Resumo Rápido
-- Moderno (19c+): restart simples
ALTER SEQUENCE esquema.seq RESTART;
-- Moderno (19c+): restart para valor específico
ALTER SEQUENCE esquema.seq RESTART START WITH 1000;
-- Clássico: substitua X pelo NEXTVAL atual
ALTER SEQUENCE esquema.seq MINVALUE 0 INCREMENT BY -X NOCACHE;
SELECT esquema.seq.NEXTVAL FROM dual; -- Retorna: 0
ALTER SEQUENCE esquema.seq INCREMENT BY 1;
SELECT esquema.seq.NEXTVAL FROM dual; -- Retorna: 1
ALTER SEQUENCE esquema.seq MINVALUE 1;
-- Identity column
ALTER TABLE esquema.tabela
MODIFY (coluna GENERATED AS IDENTITY (START WITH 1));