Usando la restrición CHECK

12 comentarios

Para evitar que ingrese basura en nuestra tabla (se le llama basura a un dato que está pero que no debería estar) el Firebird nos provee de varias armas: dominios, triggers y checks.

Un check es una restricción, una limitación que deben cumplir los datos para que sean considerados válidos y puedan ser grabados.

Por ejemplo, si los precios no pueden ser negativos podríamos tener un check que evite guardar precios negativos. Si las notas de los alumnos deben estar entre 0 y 100 podemos tener un check que evite ingresar notas fuera de ese rango. Si las fechas no pueden ser anteriores al día 1 de enero de 2013 podemos tener un check que evite ingresar fechas anteriores.

Todos esos ejemplos involucran a una sola tabla cada vez, pero el Firebird también nos permite tener checks que involucren a varias tablas. Los usaríamos por ejemplo para evitar que la cobranza se realice antes de la venta, o que el examen se realice antes de la inscripción del alumno, o que el cheque sea emitido antes de la apertura de la cuenta corriente en el Banco.

Después de haber creado una tabla le podemos agregar todos los checks que necesitemos. La sintaxis es la siguiente:

ALTER TABLE MiTabla ADD CONSTRAINT NombreCheck CHECK (MiCondición);

En EMS SQL Manager para escribir un check debes hacer click sobre la pestaña respectiva, como se muestra en esta imagen:

CHECK1

(haciendo click en la imagen la verás más grande)

Ejemplo 1. Evitar precios de costo negativos

ALTER TABLE
   PRODUCTOS
ADD CONSTRAINT
   CHK_PRODUCTOS1
CHECK (PRD_PRECTO >= 0);

La tabla se llama PRODUCTOS y en la columna PRD_PRECTO se guardan los precios de costo de los productos

Ejemplo 2. Evitar que las notas de los alumnos estén fuera de rango

ALTER TABLE
   EXAMENES
ADD CONSTRAINT
   CHK_EXAMENES1
CHECK(EXA_NOTAXX >= 0 AND EXA_NOTAXX <= 100);

La tabla se llama EXAMENES y en la columna EXA_NOTAXX se guardan las notas de los alumnos

Ejemplo 3. Evitar que la fecha de la venta sea anterior al 1 de enero de 2013

ALTER TABLE
   VENTASCAB
ADD CONSTRAINT
   CHK_VENTASCAB1
CHECK (VTC_FECHAX >= '01-01-2013');

La tabla se llama VENTASCAB (cabecera de las ventas) y en la columna VTC_FECHAX se guardan las fechas de las ventas

Ejemplo 4. Evitar la grabación si el valor de una columna no existe en otra tabla

ALTER TABLE
   BANCOS
ADD CONSTRAINT
   CHK_BANCOS1
CHECK (BAN_CODSUC IN (SELECT SUC_CODIGO FROM SUCURSALES));

La tabla se llama BANCOS y en la columna BAN_CODSUC se guarda el código de la Sucursal. Se busca ese código en la tabla de SUCURSALES. Si no existe, entonces esta fila no podrá ser grabada. Esta no es la única forma de resolver este problema, pero se muestra aquí para que puedas ver como usarla cuando necesites que una fila se grabe solamente si existe un valor (o más de un valor) en otra tabla.

Conclusión:

La restricción CHECK es extremadamente útil para evitar que alguien ingrese basura en las tablas de nuestra Base de Datos. Si la usamos bien entonces no estaremos dependiendo de que los programas (escritos en Visual FoxPro, Visual Basic, C, C++, Delphi, Java, PHP, etc.) se acuerden de evitar el ingreso de la basura. Simplemente si un dato no cumple con la restricción del check no será grabado. Punto.

En los ejemplos de arriba se mostró como evitar algunas situaciones comunes pero desde luego que hay muchísimas otras posibilidades. Como el Firebird nos permite tener un SELECT (o más de un SELECT) dentro de un CHECK entonces la cantidad de condiciones que podemos escribir es impresionante, y deberíamos usar esta facilidad para que nuestra Base de Datos sea confiable.

Más de 10.000 visitas a mi blog

13 comentarios

¡¡¡MUCHÍSIMAS GRACIAS A TODOS!!!

Ayer 17 de mayo de 2013 se superaron las 10.000 visitas, algo que me parecía lejanísimo cuando inicié este blog el día 2 de marzo de 2013

Los primeros días tenía muy pocas visitas, luego fueron aumentando y durante el mes de mayo el aumento fue muy pronunciado. Durante marzo el promedio fue de 85 visitas por día, durante abril el promedio fue de 94 visitas por día y en lo que va de mayo el promedio es de 285 visitas por día y con tendencia a aumentar.

Este blog ha sido visitado por personas de los 5 continentes aunque de América como es lógico proviene la grandísima mayoría ya que está escrito en idioma castellano.

Desde el principio los tres países con mayor cantidad de visitas diarias fueron Argentina, España y México. Por la diferencia de horario casi siempre España empezaba con mayor cantidad de visitas pero a lo largo del día generalmente era superada por Argentina o por México quienes se turnaban en tener la mayor cantidad de visitantes.

Durante todo el mes de marzo el primer puesto era intermitentemente ocupado por Argentina y por México, la diferencia entre ellos era tan pequeña que en un momento uno estaba arriba y unos minutos después estaba el otro. Sin embargo, desde principios de abril México le superó a Argentina casi todos los días y ahora la diferencia ya es muy grande.

España hace mucho que ocupa el tercer lugar y parece muy difícil que le arrebaten ese puesto. Lo mismo con Colombia en el cuarto lugar, no parece probable que sea desplazada. En el quinto lugar se intercambian Paraguay y Perú, es un puesto muy disputado y algunos días está uno y otros días está el otro.

En los puestos séptimo, octavo y noveno se encuentran desde hace mucho Venezuela, Ecuador y Chile en ese orden y no parece probable que se modifique.

En las demás posiciones principales hay muy pocas variaciones, a principios de este mes de Mayo hubo muchísimas visitas de Bolivia que subió muchos puestos llegando a ocupar el décimo lugar pero luego se quedó y actualmente está en el 11. Desde El Salvador también hubo muchas visitas este mes y por eso ahora ocupa cómodamente el décimo puesto.

En este mapa pueden ver las visitas por país, cuanto más oscuro es un color significa que hay más visitantes de ese país.

GRACIAS1

(haciendo click en la imagen la verás más grande)

Y a continuación la cantidad de visitas por país, hasta el momento de escribir este artículo la suma total es de 10.248 aunque va aumentando con el transcurrir de los minutos. El día con mayor cantidad de visitas hasta ahora fue el 13 de mayo de 2013 con 566.

GRACIAS2

GRACIAS3

Nuevamente, muchísimas gracias a todos por visitar este blog y espero que nadie se moleste por este artículo off-topic pero estoy contento por haber llegado a las 10.000 visitas y quería agradecerles por eso.

Para mí es un logro haber llegado a las 10.000 visitas en dos meses y medio, eso significa que Firebird le interesa a bastante gente y me motiva para continuar escribiendo artículos sobre este buenísimo motor SQL.

Cuando yo empecé con Firebird había muy poca información en idioma castellano, la mayor parte de la información disponible estaba escrita en inglés, en portugués y en ruso. Los dos primeros leo bien pero del tercero ni idea. Así que ahora el objetivo de este blog es llegar a ser la fuente de información sobre Firebird más completa existente en idioma castellano para que cualquier pregunta que tengas sobre Firebird puedas encontrar la respuesta aquí, espero que en los meses venideros se pueda alcanzar ese objetivo.

Lo anterior implica que si deseas que profundice sobre algún tema o quieres que toque un tema que aún no fue tratado me lo puedes pedir y lo cumpliré lo más pronto posible.

Nuevamente, muchas gracias a todos y cada uno de ustedes por visitar mi blog.

Walter.