update - trigger mysql w3schools
¿Cómo abortar la operación INSERT en el disparador de MySql? (3)
Los comentarios en la documentación de mysql sobre desencadenadores sugieren que no existe tal característica en mysql. Lo mejor que puede hacer es crear una tabla separada para sus errores de activación, como se sugiere en la misma página .
Tengo una tabla que contiene una url y una cadena que representa sus parámetros. El problema es que quiero una URL y una cadena de parámetros para ser la restricción única para la tabla, es decir, ninguna entrada puede tener la misma URL Y cadena de parámetros. La cadena de parámetros puede ser de longitud arbitraria (más de 800 bytes o más, que es la longitud máxima para una clave MySql, por lo que no puedo usar Unique (url, params) ya que arroja un error ...).
Pensé en usar desencadenadores para hacer esto, pero ¿cómo puedo lanzar una excepción / generar un error si el desencadenador descubre que la inserción está a punto de insertar una entrada duplicada? Me imagino que me gustaría tener una MySqlException arrojada como lo hace MySql con claves duplicadas, etc. para poder verla en mi código C #.
Tengo dos piezas en el gatillo con las que necesito ayuda: ... Excepción de aborto a C # ... ¿Cómo puedo lanzar una excepción, etc. a C #? ... Permitir inserción ... - ¿cómo puedo permitir la inserción si no hay una entrada duplicada?
Aquí está el código de activación:
CREATE TRIGGER urls_check_duplicates
BEFORE INSERT ON urls
FOR EACH ROW
BEGIN
DECLARE num_rows INTEGER;
SELECT COUNT(*)
INTO num_rows
FROM urls
WHERE url = NEW.url AND params = NEW.params;
IF num_rows > 0 THEN
... ABORT/throw exception to C# ...
ELSE
... Allow insert ...
END
Me encontré con esto y aunque la solución funciona, más tarde me encontré con lo que siento como una mejor solución. Sospecho que esta no era una opción cuando esta pregunta fue respondida originalmente.
CREATE TRIGGER `TestTable_SomeTrigger`
BEFORE UPDATE ON `test_table`
FOR EACH ROW
BEGIN
DECLARE msg VARCHAR(255);
IF (SomeTestToFail = "FAIL!") THEN
set msg = "DIE: You broke the rules... I will now Smite you, hold still...";
SIGNAL SQLSTATE ''45000'' SET MESSAGE_TEXT = msg;
END IF;
-- Do any other code here you may want to occur if it''s all OK or leave blank it will be
-- skipped if the above if is true
END$$
Esto ahora devolverá un mensaje de error agradable (¡o maligno!) Que puede atrapar. Para obtener más información sobre esto, consulte: http://dev.mysql.com/doc/refman/5.5/en/signal.html
¡Espero que esto ayude a alguien más!
Si la definición de su tabla es para un valor NOT NULL, podría establecer NEW en NULL, lo que efectivamente no haría la inserción. Es posible que deba activar el modo sql estricto para que esto funcione correctamente.