martes, 18 de noviembre de 2014

Script - Valores repetidos en Índice Único

Si queremos tener valores repetidos en una tabla, pero que las futuras inserciones se eviten duplicidades, se puede hacer uso de constraints tipo UNIQUE en estado ENABLE NOVALIDATE, es decir, donde los datos a insertar deben cumplir la restricción, pero pueden existir datos en la tabla que no lo hagan.

Este caso es un poco especial, ya que el comando habitual "... ENABLE NOVALIDATE" no funciona directamente, hay que crear el índice de tipo NORMAL previamente:

-- Ejemplo:

-- Creamos la tabla PRU1 con valores duplicados
CREATE TABLE PRU1 AS SELECT TABLE_NAME, OWNER FROM DBA_TABLES UNION ALL SELECT TABLE_NAME, OWNER FROM DBA_TABLES;

-- Creamos un índice "normal" sobre dicha tabla en los campos necesarios
CREATE INDEX PRU1_01_I ON PRU1(TABLE_NAME, OWNER);

-- Añadimos la constraint en estado "enable novalidate"
ALTER TABLE PRU1 ADD CONSTRAINT PRU1_01_I UNIQUE (TABLE_NAME, OWNER) ENABLE NOVALIDATE;

Así, no se podrán insertar valores repetidos en la tabla, pero se mantienen en la misma valores repetidos.