Поскольку эта статья выходит на первое место, когда я ищу обработку ошибок в триггерах MySQL, я решил поделиться некоторыми знаниями.
Если есть ошибка, вы можете заставить MySQL использовать SIGNAL , но если вы не укажете его как класс как SQLEXCEPTION, то ничего не произойдет, так как не все SQLSTATE считаются плохими и даже в этом случае вам необходимо убедиться, что RESIGNAL , если у вас есть вложенные блоки BEGIN / END.
В качестве альтернативы, и, возможно, еще проще, в вашем триггере объявить обработчик выхода и повторно передать исключение.
CREATE TRIGGER `my_table_AINS` AFTER INSERT ON `my_table` FOR EACH ROW
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
RESIGNAL;
DECLARE EXIT HANDLER FOR SQLWARNING
RESIGNAL;
DECLARE EXIT HANDLER FOR NOT FOUND
RESIGNAL;
-- Do the work of the trigger.
END
И если в вашем теле произойдет ошибка, она будет отброшена наверх и выйдет с ошибкой. Это также может быть использовано в хранимых процедурах и еще много чего.
Это работает с любой версией 5.5 +.