是的。AFAIK,MySQL 5.1 没有对触发器工作方式的语义进行任何更改。MySQL 尝试支持触发器语义的 ANSI/ISO SQL 规范。
您可以想象有一系列操作在将一行写入数据库时运行:
- 在触发器之前运行
- 评估约束、强制执行
NOT NULL
、应用DEFAULT
值
- 将行写入数据库
- 更新索引
- 在触发器之后运行
到达 AFTER 触发器后,更改行中的值为时已晚。在某些数据库中,您可以设置NEW.somecolumn = 1234
但此更改会在 AFTER 触发器完成时被静默丢弃。在其他数据库中,它通过在定义触发器或运行触发器时给出错误来帮助您理解错误。
AFTER 触发器最适合用于因插入/更新行而采取的额外操作,例如您提到的审计日志记录。一方面,MySQL 只允许每个表的每个操作一个触发器,因此如果您还使用 BEFORE 触发器来更改值和执行业务规则,那么现在您至少可以将额外的操作保留在单独的触发器中。这使得更新一个或另一个变得更容易。
另一个考虑因素是,只有在您知道该行已成功保存后,您才应该执行额外的操作。例如,在 BEFORE 触发器中记录更改,然后由于 NOT NULL 约束而中止更改是不正确的。
对于需要删除其他表中的相关行的 DELETE 操作,您可能仍需要在 BEFORE 触发器中执行此操作。