Conoce SQL – Restricciones – CHECK

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.

You may also like...

7 Responses

  1. pirki dice:

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

  2. JuserNt dice:

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

    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.

  4. cesar dice:

    CREATE TABLE datospersonales
    (Cédula VARCHAR(5) NOT NULL PRIMARY KEY,
    Nombre VARCHAR(20) NOT NULL,
    Estado_civil enum(‘soltero’,’casado’,’divorciado’))

  5. Fernanda dice:

    you’ve studied graph toerhy in computer science classes you’ll remember that the order of child nodes in a tree is irrelevant to the graph. That is, (R (F) (M) (L)) is the same tree as (R (M) (L) (F)).So keep in mind that display order data properly should be separate from the hierarchy data.But since path enumeration is essentially a denormalized solution already, perhaps we can bend the rules.Therefore you could just make sure to update the primary key values of tree nodes, so that the natural order of these values matches your desired display order.This is admittedly a fragile solution, and pretty much a hack of coupling the sibling order to the primary key values (which should be arbitrary and independent of meaning).This illustrates that each solution to represent trees in SQL has its strengths and weaknesses, and therefore which design you use should be based on the types of queries you need in a given application.It would take a whole book to compare how to implement every scenario in all the designs of trees. In my book “SQL Antipatterns,” I had to limit myself to 20 pages on hierarchical data, because there are other topics to cover.

  6. C’est le cas typique du site où l’on veut tout mettre sur la homepage et où finalement rien ne ressort. Et je pense que notre métier, c’est de mettre le client au pied du mur en lui faisant comprendre qu’il doit faire des choix !De plus sur ce site on voit bien que ils ne savent pas comment mettre en avant les éléments (tout est identique, aucune illustration/image/icones, pas de ‘espace vide pour respirer, etc)Il est clair que souvent le client confond design et architecture de l’info, design et ergonomie, design et wireframes, etc

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *