Listado completo de tutoriales

36 - Restricción check


La restricción "check" especifica los valores que acepta un campo, evitando que se ingresen valores inapropiados.

La sintaxis básica es la siguiente:

 alter table NOMBRETABLA
 add constraint NOMBRECONSTRAINT
 check CONDICION;

Trabajamos con la tabla "libros" de una librería que tiene los siguientes campos: codigo, titulo, autor, editorial, preciomin (que indica el precio para los minoristas) y preciomay (que indica el precio para los mayoristas).

Los campos correspondientes a los precios (minorista y mayorista) se definen de tipo decimal(5,2), es decir, aceptan valores entre -999.99 y 999.99. Podemos controlar que no se ingresen valores negativos para dichos campos agregando una restricción "check":

 alter table libros
 add constraint CK_libros_precio_positivo
 check (preciomin>=0 and preciomay>=0);

Este tipo de restricción verifica los datos cada vez que se ejecuta una sentencia "insert" o "update", es decir, actúa en inserciones y actualizaciones.

Si la tabla contiene registros que no cumplen con la restricción que se va a establecer, la restricción no se puede establecer, hasta que todos los registros cumplan con dicha restricción.

La condición puede hacer referencia a otros campos de la misma tabla. Por ejemplo, podemos controlar que el precio mayorista no sea mayor al precio minorista:

 alter table libros
 add constraint CK_libros_preciominmay
 check (preciomay<=preciomin);

Por convención, cuando demos el nombre a las restricciones "check" seguiremos la misma estructura: comenzamos con "CK", seguido del nombre de la tabla, del campo y alguna palabra con la cual podamos identificar fácilmente de qué se trata la restricción, por si tenemos varias restricciones "check" para el mismo campo.

Un campo puede tener varias restricciones "check" y una restricción "check" puede incluir varios campos.

Si un campo permite valores nulos, "null" es un valor aceptado aunque no esté incluido en la condición de restricción.

Ingresemos el siguiente lote de comandos SQL en pgAdmin:

 drop table if exists libros;
 
 create table libros(
  codigo serial,
  titulo varchar(40),
  autor varchar(30),
  editorial varchar(15),
  preciomin decimal(5,2),
  preciomay decimal(5,2),
  primary key(codigo)
 );

 insert into libros (titulo,autor,editorial,preciomin,preciomay)
    values ('Aprenda PHP','Mario Molina','Siglo XXI', 48, 53);

-- Agregamos una restricción "check" para asegurar que los valores de los 
 -- campos correspondientes a precios no puedan ser negativos:
 alter table libros
  add constraint CK_libros_precios_positivo
  check (preciomin>=0 and preciomay>=0);

 -- Si intentamos ingresar un valor inválido para algún campo correspondiente
 -- al precio, que vaya en contra de la restricción, por ejemplo el valor "-15"
 -- aparecerá un mensaje de error indicando que hay conflicto con la restricción
 -- creada anteriormente y la inserción no se realiza.
 insert into libros (titulo,autor,editorial,preciomin,preciomay)
    values ('Python para todos','Rodriguez','Siglo XXI', -10, 40);

La ejecución de este lote de comandos SQL genera una salida similar a:

PostgreSQL pgAdmin restricción check


Retornar