usar secuencias ejemplos ejemplo sql database oracle plsql

secuencias - sql server sequence



crear tabla con sequence.nextval en orĂ¡culo (5)

Oracle 12c

Ahora finalmente tenemos columnas de IDENTITY como muchas otras bases de datos, en caso de que una secuencia se genere automáticamente detrás de las escenas. Esta solución es mucho más rápida que una basada en disparadores, como se puede ver en esta publicación de blog .

Entonces, su creación de tabla se vería así:

CREATE TABLE qname ( qname_id integer GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL PRIMARY KEY, qname VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE );

Oracle 11g y abajo

De acuerdo con la documentation , no puedes hacer eso:

Restricción en valores de columna predeterminados Una expresión DEFAULT no puede contener referencias a funciones PL / SQL o a otras columnas, los pseudocolumnos CURRVAL, NEXTVAL, LEVEL, PRIOR y ROWNUM, o constantes de fecha que no están completamente especificadas.

La forma estándar de tener columnas "autoincrementar" en Oracle es usar activadores, por ejemplo

CREATE OR REPLACE TRIGGER my_trigger BEFORE INSERT ON qname FOR EACH ROW -- Optionally restrict this trigger to fire only when really needed WHEN (new.qname_id is null) DECLARE   v_id qname.qname_id%TYPE; BEGIN -- Select a new value from the sequence into a local variable. As David -- commented, this step is optional. You can directly select into :new.qname_id SELECT qname_id_seq.nextval INTO v_id FROM DUAL; -- :new references the record that you are about to insert into qname. Hence, -- you can overwrite the value of :new.qname_id (qname.qname_id) with the value -- obtained from your sequence, before inserting :new.qname_id := v_id; END my_trigger;

Lea más sobre Oracle TRIGGERs en la documentación

Esta pregunta ya tiene una respuesta aquí:

Creé una secuencia usando la siguiente consulta,

create sequence qname_id_seq start with 1 increment by 1 nocache;

Ahora, cuando intento crear una tabla que usa la secuencia anterior, arroja el siguiente error:

Error report: SQL Error: ORA-00907: missing right parenthesis 00907. 00000 - "missing right parenthesis"

Utilicé la siguiente consulta para crear una tabla con sequence.nextval,

CREATE TABLE qname ( qname_id integer NOT NULL default qname_id_seq.nextval PRIMARY KEY, qname VARCHAR2(4000) NOT NULL -- CONSTRAINT qname_uk UNIQUE );


En Oracle 12c también puede declarar una columna de identidad

CREATE TABLE identity_test_tab ( id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, description VARCHAR2(30) );

ejemplos y pruebas de rendimiento aquí ... donde, es corto, la conclusión es que el uso directo de la secuencia o la nueva columna de identidad son mucho más rápidos que los desencadenantes.



Puede usar la herramienta SQL Developer de Oracle para hacer eso (la versión My Oracle DB es 11). Al crear una tabla, elija la opción Avanzado y haga clic en la pestaña Columna de identidad en la parte inferior y, a partir de allí, elija Secuencia de columnas . Esto generará una columna AUTO_INCREMENT (Trigger correspondiente y Squence) para usted.


Yo mismo prefiero la solución de Lukas Edger.

Pero es posible que desee saber que también hay una función SYS_GUID que se puede aplicar como valor predeterminado a una columna y generar identificadores únicos.

puedes leer más sobre los pros y los contras here