在清理这个答案时,我TRIGGER对MySQL和s和存储过程有了一些了解,但感到震惊的是,尽管BEFORE INSERTand BEFORE UPDATE触发器可以修改数据,但它们似乎不会导致插入/更新失败(即验证)。在这种特殊情况下,我可以通过处理数据以导致主键重复的方式来使其工作,这在这种特殊情况下是有道理的,但在一般意义上不一定有意义。
TRIGGER
BEFORE INSERT
BEFORE UPDATE
这种功能在MySQL中可行吗?在其他RDBMS中(可悲的是,我的经验仅限于MySQL)?也许是THROW EXCEPTION样式语法?
THROW EXCEPTION
从这篇博客文章
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;
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;