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

Cómo definir una clave principal de incremento automático en Oracle

Para gran frustración de los administradores de bases de datos de todo el mundo, antes de la versión 12c de Oracle a mediados de 2014, Oracle simplemente no tenía la capacidad inherente de generar de forma inherente columnas de incremento automático dentro de un esquema de tabla. Si bien las razones de esta decisión de diseño solo se pueden adivinar, la buena noticia es que incluso para los usuarios de sistemas Oracle más antiguos, existe una posible solución para sortear este escollo y crear su propia columna de clave principal incrementada automáticamente.

Creando una Secuencia

El primer paso es crear una SEQUENCE en su base de datos, que es un objeto de datos al que múltiples usuarios pueden acceder para generar automáticamente valores incrementados. Como se explica en la documentación, una secuencia en Oracle evita que se creen valores duplicados simultáneamente porque varios usuarios se ven obligados a "tomar turnos" antes de que se genere cada elemento secuencial.

A los efectos de crear una clave primaria única para una nueva tabla, primero debemos CREATE la tabla que usaremos:

CREATE TABLE books (
  id      NUMBER(10)    NOT NULL,
  title   VARCHAR2(100) NOT NULL
);

A continuación, debemos agregar una PRIMARY KEY restricción:

ALTER TABLE books
  ADD (
    CONSTRAINT books_pk PRIMARY KEY (id)
  );

Finalmente, crearemos nuestra SEQUENCE que se utilizará más tarde para generar realmente el valor incrementado automático único.

CREATE SEQUENCE books_sequence;

Agregar un disparador

Si bien tenemos nuestra tabla creada y lista para funcionar, nuestra secuencia hasta ahora está sentada allí pero nunca se ha puesto en uso. Aquí es donde TRIGGERS entra.

Similar a un event en los lenguajes de programación modernos, un TRIGGER en Oracle es un procedimiento almacenado que se ejecuta cuando ocurre un evento en particular.

Normalmente un TRIGGER se configurará para activarse cuando se actualice una tabla o se elimine un registro, proporcionando un poco de limpieza cuando sea necesario.

En nuestro caso, queremos ejecutar nuestro TRIGGER antes de INSERT en nuestros books tabla, asegurando nuestra SEQUENCE se incrementa y ese nuevo valor se pasa a nuestra columna de clave principal.

CREATE OR REPLACE TRIGGER books_on_insert
  BEFORE INSERT ON books
  FOR EACH ROW
BEGIN
  SELECT books_sequence.nextval
  INTO :new.id
  FROM dual;
END;

Aquí estamos creando (o reemplazando si existe) el TRIGGER llamado books_on_insert y especificando que queremos que el activador se dispare BEFORE INSERT ocurre para los books tabla, y ser aplicable a todas y cada una de las filas de la misma.

El 'código' del activador en sí es bastante simple:SELECT el siguiente valor incremental de nuestro books_sequence creado previamente SEQUENCE , e insertándolo en el :new registro de los books tabla en el .id especificado campo.

Nota:El FROM dual parte es necesaria para completar una consulta adecuada, pero es irrelevante en la práctica. El dual table es solo una única fila ficticia de datos y se agrega, en este caso, solo para que pueda ignorarse y, en su lugar, podamos ejecutar la función del sistema de nuestro activador en lugar de devolver datos de algún tipo.

Columnas IDENTIDAD

IDENTITY Las columnas se introdujeron en Oracle 12c, lo que permite una funcionalidad de incremento automático simple en las versiones modernas de Oracle.

Usando la IDENTITY La columna es funcionalmente similar a la de otros sistemas de bases de datos. Recreando nuestros books anteriores esquema de tabla en Oracle 12c moderno o superior, simplemente usaríamos la siguiente definición de columna.

CREATE TABLE books (
  id      NUMBER        GENERATED BY DEFAULT ON NULL AS IDENTITY,
  title   VARCHAR2(100) NOT NULL
);