一尘不染

导致INSERT失败的TRIGGER?可能?

mysql

在清理这个答案时,TRIGGER对MySQL和s和存储过程有了一些了解,但感到震惊的是,尽管BEFORE INSERTand
BEFORE UPDATE触发器可以修改数据,但它们似乎不会导致插入/更新失败(即验证)。在这种特殊情况下,我可以通过处理数据以导致主键重复的方式来使其工作,这在这种特殊情况下是有道理的,但在一般意义上不一定有意义。

这种功能在MySQL中可行吗?在其他RDBMS中(可悲的是,我的经验仅限于MySQL)?也许是THROW EXCEPTION样式语法?


阅读 313

收藏
2020-05-17

共1个答案

一尘不染

从这篇博客文章

MySQL触发器:如何使用触发器中止INSERT,UPDATE或DELETE?在EfNet的#mysql上,有人问:

如果我的业务规则失败,如何使触发器中止操作?

在MySQL 5.0和5.1中,您需要采取一些技巧来使触发器失败并传递有意义的错误消息。MySQL存储过程常见问题说明了有关错误处理的内容:

SP 11. SP是否具有“ raise”语句来“ raise application error”?
抱歉,目前不行。SQL标准SIGNAL和RESIGNAL语句位于TODO上。

也许MySQL
5.2将包含SIGNAL语句,这将使该黑客直接从MySQL存储过程编程中被盗。什么是hack?您将迫使MySQL尝试使用不存在的列。丑陋?是。它行得通吗?当然。

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;
2020-05-17