sql >> Base de Datos >  >> RDS >> Oracle

crear tabla con secuencia.nextval en Oracle

Oráculo 12c

Ahora finalmente tenemos IDENTITY columnas como muchas otras bases de datos, en caso de que una secuencia se genere automáticamente detrás de escena. 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, la creación de su 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 e inferior

Según la documentación, no puedes hacer eso:

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

La forma estándar de tener columnas de "incremento automático" en Oracle es usar disparadores, 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 los TRIGGER de Oracle en la documentación