我一直在创建触发器页面上阅读MySql 5.0注释流 ,我想询问社区是否建议是否良好以及它们是否仍然适用于5.1.我今天注意到使用触发器的原因是使用AFTER UPDATE更新旧表中的字段是不可能的.
BEFORE触发器要小心.可能会出现约束,特别是如果您使用InnoDB引擎,其中插入将失败,但BEFORE触发器中的操作将成功.
使用BEFORE触发器主要用于约束或规则,而不是事务,调整NEW.*列应该没问题.
坚持使用AFTER触发器进行大多数其他操作,例如插入历史表或更新非规范化.
Bill Karwin.. 13
是.AFAIK,MySQL 5.1没有对触发器工作方式的语义做任何改变.MySQL尝试支持触发语义的ANSI/ISO SQL规范.
您可以想象,当一行写入数据库时,会运行一系列操作:
运行BEFORE触发器
评估约束,强制执行NOT NULL
,应用DEFAULT
值
将行写入数据库
更新索引
运行AFTER触发器
一旦你到达AFTER触发器,改变行中的值为时已晚.在某些数据库中,您可以设置,NEW.somecolumn = 1234
但在AFTER触发器完成时会自动丢弃此更改.在其他数据库中,它可以通过在定义触发器或运行触发器时给出错误来帮助您理解错误.
AFTER触发器最适合用于行的INSERT/UPDATE的额外操作,例如您提到的审计日志记录.首先,MySQL每个表只允许每个操作一个触发器,因此如果您还使用BEFORE触发器来更改值并强制执行业务规则,那么现在您至少可以将额外的操作保存在单独的触发器中.这样可以更容易地更新其中一个.
另一个考虑因素是,只有在知道行已成功保存后,才应该执行额外的操作.例如,在BEFORE触发器中记录更改是不正确的,然后由于NOT NULL约束而使更改中止.
对于需要在其他表中删除相关行的DELETE操作,您可能仍需要在BEFORE触发器中执行此操作.
是.AFAIK,MySQL 5.1没有对触发器工作方式的语义做任何改变.MySQL尝试支持触发语义的ANSI/ISO SQL规范.
您可以想象,当一行写入数据库时,会运行一系列操作:
运行BEFORE触发器
评估约束,强制执行NOT NULL
,应用DEFAULT
值
将行写入数据库
更新索引
运行AFTER触发器
一旦你到达AFTER触发器,改变行中的值为时已晚.在某些数据库中,您可以设置,NEW.somecolumn = 1234
但在AFTER触发器完成时会自动丢弃此更改.在其他数据库中,它可以通过在定义触发器或运行触发器时给出错误来帮助您理解错误.
AFTER触发器最适合用于行的INSERT/UPDATE的额外操作,例如您提到的审计日志记录.首先,MySQL每个表只允许每个操作一个触发器,因此如果您还使用BEFORE触发器来更改值并强制执行业务规则,那么现在您至少可以将额外的操作保存在单独的触发器中.这样可以更容易地更新其中一个.
另一个考虑因素是,只有在知道行已成功保存后,才应该执行额外的操作.例如,在BEFORE触发器中记录更改是不正确的,然后由于NOT NULL约束而使更改中止.
对于需要在其他表中删除相关行的DELETE操作,您可能仍需要在BEFORE触发器中执行此操作.