¿Cómo reinicio una secuencia en Oracle?

Resuelto Mauli asked hace 16 años • 18 respuestas

En PostgreSQL , puedo hacer algo como esto:

ALTER SEQUENCE serial RESTART WITH 0;

¿Existe un equivalente de Oracle?

Mauli avatar Sep 09 '08 16:09 Mauli
Aceptado

Aquí hay un buen procedimiento para restablecer cualquier secuencia a 0 del gurú de Oracle Tom Kyte . Gran discusión sobre los pros y los contras en los enlaces a continuación también.

tkyte@TKYTE901.US.ORACLE.COM> 
create or replace
procedure reset_seq( p_seq_name in varchar2 )
is
    l_val number;
begin
    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by -' || l_val || 
                                                          ' minvalue 0';

    execute immediate
    'select ' || p_seq_name || '.nextval from dual' INTO l_val;

    execute immediate
    'alter sequence ' || p_seq_name || ' increment by 1 minvalue 0';
end;
/

De esta página: SQL dinámico para restablecer el valor de la secuencia
Otra buena discusión también está aquí: ¿ Cómo restablecer las secuencias?

Doug Porter avatar Sep 18 '2008 15:09 Doug Porter

Un verdadero reinicio no es posible AFAIK . (¡Por favor corrígeme si estoy equivocado!).

Sin embargo, si desea establecerlo en 0, puede simplemente eliminarlo y volver a crearlo.

Si desea establecerlo en un valor específico, puede establecer INCREMENT en un valor negativo y obtener el siguiente valor.

Es decir, si su secuencia está en 500, puede configurarla en 100 mediante

ALTER SEQUENCE serial INCREMENT BY -400;
SELECT serial.NEXTVAL FROM dual;
ALTER SEQUENCE serial INCREMENT BY 1;
Mo. avatar Sep 09 '2008 09:09 Mo.

Para secuencias regulares:

alter sequence serial restart start with 1;

Para secuencias generadas por el sistema utilizadas para columnas de identidad:

alter table table_name modify id generated by default on null as identity(start with 1);

Esta característica se agregó oficialmente en 18c pero está disponible de manera extraoficial desde 12.1.

Podría decirse que es seguro utilizar esta característica no documentada en 12.1. Aunque la sintaxis no está incluida en la documentación oficial , es generada por el paquete DBMS_METADATA_DIFF de Oracle . Lo he usado varias veces en sistemas de producción. Sin embargo, creé una solicitud de servicio de Oracle y verificaron que no se trata de un error de documentación; la función realmente no es compatible.

En 18c, la característica no aparece en la sintaxis del lenguaje SQL, pero se incluye en la Guía del administrador de bases de datos .

Jon Heller avatar Oct 30 '2013 03:10 Jon Heller