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.
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: