3

我一直在阅读创建触发器页面上的 MySql 5.0 评论流 ,我想问问社区这些建议是否很好以及它们是否仍然适用于 5.1。我今天注意到使用触发器是不可能使用 AFTER UPDATE 来更新旧表中的字段。

  1. 小心使用 BEFORE 触发器。可能会出现约束,特别是如果您使用 InnoDB 引擎,插入将失败,但来自 BEFORE 触发器的操作将成功。
  2. 将 BEFORE 触发器主要用于约束或规则,而不是事务,调整 NEW.* 列应该没问题。
  3. 对大多数其他操作坚持使用 AFTER 触发器,例如插入历史表或更新非规范化。
4

1 回答 1

13

是的。AFAIK,MySQL 5.1 没有对触发器工作方式的语义进行任何更改。MySQL 尝试支持触发器语义的 ANSI/ISO SQL 规范。

您可以想象有一系列操作在将一行写入数据库时​​运行:

  1. 在触发器之前运行
  2. 评估约束、强制执行NOT NULL、应用DEFAULT
  3. 将行写入数据库
  4. 更新索引
  5. 在触发器之后运行

到达 AFTER 触发器后,更改行中的值为时已晚。在某些数据库中,您可以设置NEW.somecolumn = 1234但此更改会在 AFTER 触发器完成时被静默丢弃。在其他数据库中,它通过在定义触发器或运行触发器时给出错误来帮助您理解错误。

AFTER 触发器最适合用于因插入/更新行而采取的额外操作,例如您提到的审计日志记录。一方面,MySQL 只允许每个表的每个操作一个触发器,因此如果您还使用 BEFORE 触发器来更改值和执行业务规则,那么现在您至少可以将额外的操作保留在单独的触发器中。这使得更新一个或另一个变得更容易。

另一个考虑因素是,只有在您知道该行已成功保存后,您才应该执行额外的操作。例如,在 BEFORE 触发器中记录更改,然后由于 NOT NULL 约束而中止更改是不正确的。

对于需要删除其他表中的相关行的 DELETE 操作,您可能仍需要在 BEFORE 触发器中执行此操作。

于 2009-01-02T21:16:02.160 回答