Creación de atributos autoincrement en Oracle

Oracle Logo MiniEn muchos casos es útil poseer campos autoincrementales en una base de datos. MySQL permite hacer esto de forma automática mediante AUTOINCREMENT pero Oracle no posee este tipo de dato. En el presente artículo vamos a aprender como hacerlo para crear un campo numérico que incremente su valor automáticamente simulando esta útil funcionalidad de MySQL.

Vamos a crear una tabla a modo de ejemplo llamada usuarios la cual va a almacenar cierta información. Esta tabla tendrá una clave primaria (idusuario) la cual será autoincrementada automáticamente.

Creación de tabla usuarios

CREATE TABLE usuarios(
  idusuario NUMBER PRIMARY KEY,
  dni VARCHAR2(9) NOT NULL,
  nombre VARCHAR(15),
  apellidos VARCHAR2(40) NOT NULL,
  fnacimiento DATE
);

Como podéis comprobar, la creación de la tabla usuarios no tiene ningún elemento diferenciador ni hay ningún indicio que va a contener un campo auto numérico.

ilumina2 photo

Creación de la secuencia

Para simular esta funcionalidad en Oracle debemos crear una secuencia, la cual poseerá las siguientes características básicas:

  • nombre
  • valor de inicio
  • valor de fin (valor máximo)
  • incremento.
CREATE SEQUENCE seq_usuarios_idusuario --nombre de la secuencia
START WITH 1 --la secuencia empieza por 1
INCREMENT BY 1 --se incrementa de uno en uno
NOMAXVALUE; --no tiene valor maximo

Con la secuencia creada, podemos obtener su valor actual llamando a la función nextval indicando nombreDeSecuencia.nextval.

SELECT seq_usuarios_idusuario.nextval FROM dual;

Con este select obtenemos un nuevo valor de la secuencia. Una vez ésta da un valor, no lo volverá a ofrecer mas. Si queremos consultar el valor por el que se encuentra actualmente la secuencia, lo podemos hacer mediante currval.

SELECT seq_usuarios_idusuario.currval FROM dual;

Ya tenemos la secuencia que genera números de forma continua, ahora necesitamos algún método para añadir estos valores a la clave primaria de la tabla creada anteriormente. Es cierto que siempre podemos usar nextval en un insert de forma:

INSERT INTO usuarios(dni, nombre)
VALUES(seq_usuarios_idusuario.nextval, 12345678A, 'Aitor', ...);

Pero quizá sea mejor buscar una forma automática de hacer esta inserción. Para ello, usaremos un disparador o trigger.

Creación del disparador

Para que este proceso se realice automáticamente debemos crear un disparador tal y como vemos a continuación.

CREATE TRIGGER trig_usuarios_seq
  BEFORE INSERT ON usuarios
  FOR EACH ROW
  BEGIN
    SELECT seq_usuarios_idusuario.nextval INTO :new.idusuario FROM dual;
  END
;

El cual, antes de realizar cualquier inserción en la tabla usuarios, asignará el nextval de nuestra secuencia al nuevo valor del campo id, con lo cual, posteriormente, se realizará el insert con el id generado automáticamente. De esta forma, en el insert anterior, podemos obviar la inserción de la clave primaria sin obtener ningún error.

INSERT INTO usuarios(dni, nombre,...) VALUES(12345678A, 'Aitor', ...);
Anuncios

One Response to Creación de atributos autoincrement en Oracle

  1. hector says:

    Esta seria la parte mas sencilla te vas a la tabla creada y le das click derecho luego crear Disparador le das crear clave primaria y secuencia y en la gráfica le das los valores y el nombre del Disparador

    create or replace trigger ININ
    before insert on “CORRESPONDENCIA”.”USUARIOS”
    for each row
    begin
    if inserting then
    if :NEW.”IDUSUARIO” is null then
    select SEQ_USUARIOS_IDUSUARIO.nextval into :NEW.”IDUSUARIO” from dual;
    end if;
    end if;
    end;

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: