crear tabla con sequence.nextval en oracle

Creé una secuencia usando la siguiente consulta,

create sequence qname_id_seq start with 1 increment by 1 nocache; 

Ahora, cuando bash 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 ); 

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 triggers, 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 pnetworkingeterminados Una expresión DEFAULT no puede contener references a funciones PL / SQL o a otras columnas, los pseudocolumnos CURRVAL, NEXTVAL, LEVEL, PRIOR y ROWNUM, o constantes de date 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 documentation

En Oracle 12c, ahora puede especificar las pseudocolumnas de la secuencia CURRVAL y NEXTVAL como valores pnetworkingeterminados para una columna. Alternativamente, puede usar columnas Identity; ver:

  • documento de reference
  • artículos: Mejoras en Oracle DB 12cR1 (12.1): valores pnetworkingeterminados para columnas de tabla y columnas de identidad en 12.1

P.ej,

 CREATE SEQUENCE t1_seq; CREATE TABLE t1 ( id NUMBER DEFAULT t1_seq.NEXTVAL, description VARCHAR2(30) ); 

Yo mismo prefiero la solución de Lukas Edger.

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

puedes leer más sobre los pros y los contras aquí

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 testings de performance 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 click 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.