Con G de GNU

Conoce SQL – Restricciones – CHECK

por Maxpowel en abr.15, 2009

1 – D: Restricción CHECK

Como siempre digo, esta restricción nos ayuda a mantener integridad de los datos. En un caso anterior, mencioné que en la tabla paquetes a alguien se le podría haber ocurrido poner una columna de “entregado” y con los únicos valores de “si” o “no”. Hasta ahora teníamos que confiar en que se introdujeran los datos correctamente porque no había nada que nos evitara poner “jo” o “21″ o “$&”. Estas validaciones las podemos hacer con CHECK.

La sintaxis debería de ser así

CREATE TABLE paquetes2 (
descripcion varchar(255),
entregado char(2),
CONSTRAINT paquetes_entregado_ck CHECK (entregado=’si’ or entregado=’no’)
)

o

CREATE TABLE paquetes2 (
descripcion varchar(255),
entregado char(2)  CHECK (entregado=’si’ or entregado=’no’)
)

Digo debería porque el parseador de mysql lo intepreta pero NO hace nada, lo ignora. Y si no funciona, para que lo ponen? Pues porque forma parte del SQL estandar y reconoce la sintaxis aunque lo ignore. En otros SGDB si que funciona y no entiendo porque en MySQL no. De todas formas tampoco es algo que importe mucho, ahora digo por qué.

Con check solo podemos hacer comprobaciones sencillas y como mucho comparar con elementos de la misma tabla. Por ejemplo:

CREATE TABLE paquetes2 (
id_persona INT,
id_padre INT,
id_madre INT,
CONSTRAINT padres_diferentes_ck CHECK (id_padre<>id_madre)
)

En esta tabla estoy suponiendo que una persona no puede tener como padre y madre a la misma persona (recuerdo que <> es lo mismo que !=).

Con check poco más se puede hacer. Si queremos hacer comprobaciones más complejas como por ejemplo mirar comparar con datos de otras tablas o cualquier cosa que se nos ocurra tendremos que usar triggers (disparadores). En el caso de mysql, no queda otro remedio. No sé si en un futuro se implementará CHECK en MySQL pero a día de hoy es lo que hay. Más adelante, en la parte procedimental de MySQL explicaré el uso de triggers.

Y por último, me falta decir que este tipo de restricción nos evitaría realizar la comparación de php por ejemplo:

if($_POST['id_madre']!=$_POST[‘id_padre)
{
$sql=”INSERT INTO….”;
mysql_query($sql);
}else
echo “La padre y el madre deben ser diferentes personas”;

Para serte sincero, lo único malo de validarlo mediante php es que no está integrado en la base de datos así que si usamos otro software nada nos limitará saltarnos esa restricción. Cuando usemos triggers veremos que el algoritmo es el mismo solo que en el lenguaje procedimental de mysql. Pero claro, la ventaja de tenerlo integrado en la base de datos es un gran punto a favor.

Nos vemos y espero que el próximo capítulo tenga alguna utilidad práctica.

Entradas relacionadas:

  1. Conoce SQL – Restricciones – PRIMARY KEY 1 – C: Restricción PRIMARY KEY Algo que toda tabla...
  2. Conoce SQL – Restricciones – UNIQUE Las restricciones nos ayudan a mantenera la integridad de los...
  3. Conoce SQL – Restricciones – NOT NULL 1- B: Restricción NOT NULL Algo que también he notado...
  4. Conoce SQL – Restricciones – FOREIGN KEY 1 – E: Restricción FOREIGN KEY Las foreign key o...
  5. Conoce SQL – Lenguaje procedimental 4 – Triggers También llamados disparadores, lo que hace un trigger es estar...

Guias y manuales
4 cometarios:
  1. pirki
    Internet Explorer 7.0Windows XP

    hola muy muy bien entendi, todo estoy aprendiendo, lo necesitaba… gracias, invalorable aporte….$$$$ :)

  2. JuserNt
    Firefox 3.5.3Windows XP

    Que tal si tengo mi script de tablas… y quiero agregarle una restriccion CHECK – quizas con un ALTER como en SQLSERVER-, lastimosamente mysql no maneja correctamente esto… aun. NO queda mas que usar el lenguaje(tu gusto) o SP o triggers

  3. Maxpowel
    Firefox 3.0.13Windows XP

    si, con un ALTER funcionaría. No te daría error de sintaxis pero como dices, mysql no lo maneja así que no tendrá efectos pŕacticos.

    Me gustaría aclarar una cosa, aunque pongo un ejemplo de como hacerlo mediante otro lenguaje (php en este caso) mi recomendación es usar un trigger para que esa restricción esté de parte de la base de datos y evitar así la posibilidad de que haya datos incorrectos en la base de datos.

Sitios que enlazan a esta entrada

Deja tu comentario! no mordemos!

¿Buscando algo?

Usa el formulario de debajo:

¿Sigues sin encontrar lo que buscas? ¡Deja un comentario o ponte en contacto con nosotros para que lo encontremos por ti!