На самом деле это комбинация всех трех ответов. Вы вызываете несуществующую процедуру, чтобы вызвать ошибку, а затем объявляете обработчик выхода, который перехватывает сгенерированную вами ошибку. Вот пример использования SQLSTATE 42000 (процедура не существует) для выдачи ошибки перед удалением, если для строки, которая будет удалена, установлен идентификатор внешнего ключа:
DROP PROCEDURE IF EXISTS decount_test;
DELIMITER //
CREATE DEFINER = 'root'@'localhost' PROCEDURE decount_test ( p_id bigint )
DETERMINISTIC MODIFIES SQL DATA
BEGIN
DECLARE EXIT HANDLER FOR SQLSTATE '42000'
SELECT 'Invoiced barcodes may not have accounting removed.';
IF (SELECT invoice_id
FROM accounted_barcodes
WHERE id = p_id
) THEN
CALL raise_error;
END IF;
DELETE FROM accounted_barcodes WHERE id = p_id;
END //
DELIMITER ;
Выход:
call decount_test(123456);
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. |
+----------------------------------------------------+
| Invoiced barcodes may not have accounting removed. |
+----------------------------------------------------+