jueves, 9 de junio de 2016

Incrementar la clave primaria de una tabla de Oracle cuando se inserta un nuevo registro

Es muy habitual que cada vez que se inserte un nuevo registro en una tabla queramos que la clave primaria se incremente secuencialmente.
MySQL nos proporciona el atributo AUTO_INCREMENT y por su parte SQL Server ofrece el atributo IDENTITY. Sin embargo, Oracle no tiene un atributo de este tipo así que para tener esta funcionalidad hay que crear algunos elementos auxiliares.

Será necesario, por un lado crear una secuencia y por otro un trigger que detecte cuando se inserta un nuevo registro en la tabla y que utilice la secuencia para asignarle el valor siguiente a la clave primaria.

Lo veremos con un ejemplo. Tenemos una tabla coches en la que se registra marca y modelo. La clave primaria el un código de coche que debe ser incremental.

CREATE TABLE COCHES
(codigo_coche number primary key,
marca VARCHAR2(25) NOT NULL,
modelo VARCHAR2(25) NOT NULL);


Ahora crearemos una secuencia que contendrá el último valor que se le ha dado a codigo_coche, la creamos así:

CREATE SEQUENCE scoches
START WITH 1
INCREMENT BY 1;


Si utilizamos directemente la secuencia en un insert se haría de la siguiente manera:

INSERT INTO COCHES (codigo_coche, marca, modelo)
VALUES (scoches.nextval, ‘Ford’, ‘Focus’);


Ahora vamos ha crear un trigger para no tener que preocuparnos de insertar el scoches.nextval cada vez que vamos a insertar un nuevo registro en la tabla. El disparador, antes de que se inserte en la tabla meterá en codigo_coche el siguiente valor de la secuencia:

CREATE TRIGGER TRIG_COCHES
BEFORE INSERT ON COCHES
FOR EACH ROW
BEGIN
SELECT scoches.NEXTVAL INTO :NEW.codigo_coche FROM DUAL;
END;


Ya está, ahora será mucho más sencillo insertar registros en la tabla COCHES, pues no será necesario tener en cuenta el siguiente valor de la secuencia, el trigger se encarga de esta tarea:

INSERT INTO COCHES (marca, modelo)
VALUES (‘Renault’, ‘Megane’);