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