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í:
- ¿Cómo crear ID con AUTO_INCREMENT en Oracle? 16 respuestas
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.
En Oracle 12c, ahora puede especificar las pseudocolumnas de la secuencia CURRVAL y NEXTVAL como valores predeterminados para una columna. Alternativamente, puede usar columnas Identity; ver:
- documento de referencia
- artículos: Mejoras en Oracle DB 12cR1 (12.1): valores predeterminados 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)
);
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.