tabla secuencia modificar incrementar ejemplo developer create crear con autoincrement auto_increment sql oracle sequence

sql - incrementar - modificar secuencia oracle



¿Cómo crear una secuencia de Oracle comenzando con el valor máximo de una tabla? (7)

Aquí tengo mi ejemplo que funciona bien:

declare ex number; begin select MAX(MAX_FK_ID) + 1 into ex from TABLE; If ex > 0 then begin execute immediate ''DROP SEQUENCE SQ_NAME''; exception when others then null; end; execute immediate ''CREATE SEQUENCE SQ_NAME INCREMENT BY 1 START WITH '' || ex || '' NOCYCLE CACHE 20 NOORDER''; end if; end;

Intentando crear una secuencia en Oracle que comience con el valor máximo de una tabla específica. ¿Por qué esto no funciona?

CREATE SEQUENCE transaction_sequence MINVALUE 0 START WITH (SELECT MAX(trans_seq_no) FROM TRANSACTION_LOG) INCREMENT BY 1 CACHE 20;


Basado en Ivan Laharnar con menos código y simplier:

declare lastSeq number; begin SELECT MAX(ID) + 1 INTO lastSeq FROM <TABLE_NAME>; if lastSeq IS NULL then lastSeq := 1; end if; execute immediate ''CREATE SEQUENCE <SEQUENCE_NAME> INCREMENT BY 1 START WITH '' || lastSeq || '' MAXVALUE 999999999 MINVALUE 1 NOCACHE''; end;


No puede usar una subselección dentro de una instrucción CREATE SEQUENCE . Deberá seleccionar el valor de antemano.


Si puede usar PL / SQL, intente con (EDITAR: Incorpora la sugerencia xlnt de Neil para comenzar en el siguiente valor más alto):

SELECT ''CREATE SEQUENCE transaction_sequence MINVALUE 0 START WITH ''||MAX(trans_seq_no)+1||'' INCREMENT BY 1 CACHE 20'' INTO v_sql FROM transaction_log; EXECUTE IMMEDIATE v_sql;

Otro punto a considerar: al establecer el parámetro CACHE en 20, corre el riesgo de perder hasta 19 valores en su secuencia si la base de datos deja de funcionar. Los valores de CACHEd se pierden en los reinicios de la base de datos. A menos que esté golpeando la secuencia muy a menudo, o, si no le importan demasiado las lagunas, lo pondría en 1.

Un último detalle: los valores que especificó para CACHE y INCREMENT BY son los valores predeterminados. Puedes dejarlos y obtener el mismo resultado.


Tener en medio, el valor MAX solo será el máximo de valores comprometidos . Puede devolver 1234, y es posible que deba considerar que alguien ya ha insertado 1235 pero no confirmado.


es posible que desee comenzar con max(trans_seq_no) + 1.

reloj:

SQL> create table my_numbers(my_number number not null primary key); Table created. SQL> insert into my_numbers(select rownum from user_objects); 260 rows created. SQL> select max(my_number) from my_numbers; MAX(MY_NUMBER) -------------- 260 SQL> create sequence my_number_sn start with 260; Sequence created. SQL> insert into my_numbers(my_number) values (my_number_sn.NEXTVAL); insert into my_numbers(my_number) values (my_number_sn.NEXTVAL) * ERROR at line 1: ORA-00001: unique constraint (NEIL.SYS_C00102439) violated

Cuando crea una secuencia con un número, debe recordar que la primera vez que seleccione en contra de la secuencia, Oracle devolverá el valor inicial que le asignó.

SQL> drop sequence my_number_sn; Sequence dropped. SQL> create sequence my_number_sn start with 261; Sequence created. SQL> insert into my_numbers(my_number) values (my_number_sn.NEXTVAL); 1 row created.

Si estás tratando de hacer lo ''gapless'', te recomiendo encarecidamente

1 no lo hago, y el # 2 no usa una secuencia para eso.


DECLARE v_max NUMBER; BEGIN SELECT (NVL (MAX (<COLUMN_NAME>), 0) + 1) INTO v_max FROM <TABLE_NAME>; EXECUTE IMMEDIATE ''CREATE SEQUENCE <SEQUENCE_NAME> INCREMENT BY 1 START WITH '' || v_max || '' NOCYCLE CACHE 20 NOORDER''; END;