2012-03-16 18 views
8

Quiero usar la restricción CHECK en MySQL, pero no es compatible. (A diferencia de otros RDBMS, se va a entender, pero no cumplir los cheques.)¿Puede un disparador MySQL simular una restricción CHECK?

he visto algunas soluciones con factores desencadenantes. Pero tienden a establecer un valor predeterminado para el campo en cuestión en lugar de devolver un error.

¿Es posible construir un disparador que devuelve un error si no se cumple una condición?

En última instancia, quiero un disparador que copie una restricción CHECK.

+0

¿Cuál es exactamente tu restricción 'CHECK'? Un tipo específico de restricciones Check puede ser emulado por restricciones Foreign Key. –

+0

es posible obtener un disparador para lanzar y un error si la restricción FK no es lo que buscas. Eche un vistazo a esto: http://stackoverflow.com/questions/24/throw-an-error-in-mysql-trigger –

+0

Para @ypercube: podría ser algo como CREATE TABLE test ( \t id INT PRIMARY KEY , \t número INT, \t CHECK (número> 0) ); – smnsvane

Respuesta

2

intente lo siguiente sintaxis

CREATE TRIGGER mytabletriggerexample 
BEFORE INSERT 
FOR EACH ROW BEGIN 
IF(NEW.important_value) < (fancy * dancy * calculation) THEN 
    DECLARE dummy INT; 

    SELECT Your meaningful error message goes here INTO dummy 
     FROM mytable 
     WHERE mytable.id=new.id 
END IF; END; 
7

Desde MySQL 5.5 en adelante, puede utilizar la sintaxis SIGNAL a devolver errores de procedimientos almacenados, tales como factores desencadenantes.

12

al actualizar los datos:

delimiter $$ 
create trigger chk_stats1 before update on stats 
    for each row 
    begin 
    if new.month>12 then 
     SIGNAL SQLSTATE '45000' 
     SET MESSAGE_TEXT = 'Cannot add or update row: only'; 
     end if; 
     end; 
     $$ 

cuando se está introduciendo sus datos:

delimiter $$ 
    create trigger chk_stats before insert on stats 
     for each row 
     begin 
     if new.month>12 then 
     SIGNAL SQLSTATE '45000' 
     SET MESSAGE_TEXT = 'Cannot add or update row: only'; 
     end if; 
    end; 
    $$ 

estos gatillo va a funcionar como restricción de comprobación, el trabajo antes de insertar o actualizar y verificar el mes, si el mes> 12 da error.

Cuestiones relacionadas