2012-04-16 14 views
13

Dado que MySQL ignora las restricciones de verificación, ¿cómo se puede usar un disparador para detener una inserción o actualización?Use un disparador para detener una inserción o una actualización

Por ejemplo:

Tabla foo tiene una agencia atributo llamado, y el atributo agencia sólo puede ser 1, 2, 3, 4, o 5.

delimiter $$ 
create trigger agency_check 
before insert on foo 
for each row 
begin 
if (new.agency < 1 or new.agency > 5) then 

#Do nothing? 

end if; 
end 
$$ 
delimiter ; 

o hay una manera mejor Cómo hacer restricciones de verificación en MySQL?

+0

¿Por qué no puede usar el tipo de datos 'enum' para la columna de agencia? –

Respuesta

21

Pruebe la sintaxis SEÑAL - https://dev.mysql.com/doc/refman/5.5/en/signal.html

create trigger agency_check 
before insert on foo 
for each row 
begin 
    if(new.agency < 1 or new.agency >5) then 
    SIGNAL 'your error message' 
    end if 
end 
+11

No es la sintaxis correcta para 'SIGNAL'. Debería ser 'SIGNAL SQLSTATE' 45000 'SET MESSAGE_TEXT =' su mensaje de error '; ' –

4

Si su versión de MySQL es anterior a 5.5, intente establecer un campo no nulo de la tabla a NULL. Es un truco, pero evita que se complete la actualización o la inserción.

El comando SIGNAL que sugiere Naveen se ve muy bien, y estoy deseando utilizarlo después de la actualización.

+2

Encontré una situación en la que establecer el campo no nulo no impedía la inserción. Lo que funcionó de manera consistente para mí (en Mysql 5.0 - antes de que SIGNAL esté disponible) es llamar a un procedimiento inexistente. [esta respuesta] (http://stackoverflow.com/a/1643846/109581) de [longneck] (http://stackoverflow.com/users/94475/longneck) es donde recibí el consejo de usar CALL. – bradoaks

Cuestiones relacionadas