41 - Restricciones: validación y estados (validate - novalidate - enable - disable)


Sabemos que si agregamos una restricción a una tabla que contiene datos, Oracle los controla para asegurarse que cumplen con la condición de la restricción, si algún registro no la cumple, la restricción no se establecece.

Es posible deshabilitar esta comprobación estableciendo una restricción sin comprobar los datos existentes en la tabla.

Podemos hacerlo cuando agregamos la restricción (de cualquier tipo) a una tabla para que Oracle acepte los valores ya almacenados que infringen la restricción. Para ello debemos incluir la opción "novalidate" en la instrucción "alter table":

 alter table libros
  add constraint PK_libros_codigo
  primary key (codigo) novalidate;

La restricción no se aplica en los datos existentes, pero si intentamos ingresar un nuevo valor que no cumpla la restricción (o actualizarlo), Oracle no lo permite.

Para saber si una restricción está validada o no, podemos consultar el catálogo "user_constraints" y fijarnos lo que informa la columna "validated".

También podemos deshabilitar las restricciones para agregar o actualizar datos sin comprobarla:

 alter table libros
  add constraint PK_libros_codigo
  primary key (codigo) disable;

Entonces, para evitar la comprobación de datos existentes y futuros al crear la restricción, la sintaxis básica es la siguiente:

 alter table TABLA
  add constraint NOMBRERESTRICCION
  TIPOdeRESTRICCION (CAMPO o CONDICION)--campo si es primary key o unique; condición si es check
  disable novalidate;

Por defecto (si no especificamos) la opción es "validate", es decir, controla los datos existentes y "enable", es decir, controla futuros ingresos y actualizaciones.

También es posible alterar la restricción luego de haberla creado. Sintaxis:

 alter table NOMBRETABLA
  ESTADO VALIDACION
  constraint NOMBRERESTRICCION;

En el ejemplo siguiente deshabilitamos la restricción "PK_libros_codigo" para poder ingresar un valor que infrija la restricción:

 alter table libros
  disable validate
  constraint PK_libros_codigo;

Para habilitar una restricción deshabilitada se ejecuta la misma instrucción pero con la cláusula "enable":

 alter table libros
  enable validate
  constraint PK_libros_codigo;

Para saber si una restricción está habilitada o no, podemos consultar el catálogo "user_constraints" y fijarnos lo que informa la columna "status".

Los estados "validate" y "novalidate" son relativamente independientes de los estados "enabled" y "disabled".

Cuando habilitamos una restricción "primary key" o "unique" con "enable", los datos existentes DEBEN cumplir con la restricción; aunque coloquemos "novalidate" junto a "enable", Oracle no permite que se habilite la restrición y valida los datos existentes de todas maneras. No sucede lo mismo con una restricción "check"; podemos habilitar una restricción de control con "enable" y "novalidate", Oracle habilita la restricción para futuros ingresos y actualizaciones y NO valida los datos existentes.

Entonces, "enable" o "disable" activa o desactiva la restricción para los nuevos datos ("enable" es la opción predeterminada si no se especifica); "validate" o "novalidate" es la opción para validar la restricción en los datos existentes ("validate" es la predetermidada si se omite).

Una restricción puede estar en los siguientes estados:

- validate y enabled: comprueba los valores existentes y los posteriores ingresos y actualizaciones;

- validate y disable: comprueba los valores existentes pero no las posteriores inserciones y actualizaciones;

- novalidate y enabled: no comprueba los datos existentes, pero si los posteriores ingresos y actualizaciones;

- novalidate y disabled: no comprueba los valores existentes ni los posteriores ingresos y actualizaciones.


Retornar