Category Archives: mysql

Check en mysql

Los check en mysql no funcionan

si creamos una tabla y le añadimos un check

CREATE TABLE cliente (
SD integer CHECK (SD > 0),
nombre varchar (30),
apellido varchar(30)
);

E intentamos introducir un dato que no cumpla el check no nos da ningun error:

INSERT INTO cliente values ('-2','abc','zz');
INSERT INTO cliente values (-3,'abc','zz');

Vemos que en la tabla tenemos los valores.

mysql_2

Para solventar el problema tenemos que recurrir a un trigger

CREATE TRIGGER check_trigger
BEFORE INSERT
ON cliente
FOR EACH ROW
BEGIN
IF NEW.SD<0 THEN
CALL `Error: El valor de SD tiene que ser mayor que 0`;
END IF;
END

Ahora si intentamos introducir un valor que no cumple los requisitos

INSERT INTO cliente values (-4,’tiene que fallar’,’por el trigger’);

Obtenemos un error, tal y como esperabamos:

[Err] 1305 – PROCEDURE clases.Error: El valor de SD tiene que ser mayor que 0 does not exist

Hemos resuelto el problema, no es del todo cierto, pues el trigger era solo para insert, si actualizamos un valor no salta:

update cliente set nombre=’cambiado’ where sd=-2

En mysql no se puede crear un trigger para insert or update como en oracle, por lo que hay que duplicar el trabajo.

CREATE TRIGGER check_trigger_update
BEFORE update
ON cliente
FOR EACH ROW
BEGIN
IF NEW.SD<0 THEN
CALL `Error: El valor de SD tiene que ser mayor que 0`;
END IF;
END

Ahora si ejecutamos la sentencia:

update cliente set sd=-4 where sd=-2

Nos devuelve un error, como era de esperar.