我一直在create trigger page上阅读MySql 5.0评论流 我想问一下社区是否建议是好的&他们是否仍然适用于5.1。我今天注意到使用触发器的原因是使用AFTER UPDATE更新旧表中的字段是不可能的。
答案 0 :(得分:13)
是。 AFAIK,MySQL 5.1没有对触发器工作方式的语义做任何改变。 MySQL试图支持触发语义的ANSI / ISO SQL规范。
您可以想象,当一行写入数据库时,会运行一系列操作:
NOT NULL
,应用DEFAULT
值一旦你到达AFTER触发器,改变行中的值就太晚了。在某些数据库中,您可以设置NEW.somecolumn = 1234
,但在AFTER触发器完成时会以静默方式丢弃此更改。在其他数据库中,它可以通过在定义触发器或运行触发器时给出错误来帮助您理解错误。
AFTER触发器最适合用于行的INSERT / UPDATE的额外操作,例如您提到的审计日志记录。首先,MySQL每个表每个操作只允许一个触发器,因此如果您还使用BEFORE触发器来更改值并强制执行业务规则,那么现在您至少可以将额外的操作保存在单独的触发器中。这样可以更容易地更新其中一个。
另一个考虑因素是你应该只在之后执行额外的操作你知道该行已成功保存。例如。在BEFORE触发器中记录更改是不正确的,然后由于NOT NULL约束而使更改中止。
对于需要在其他表中删除相关行的DELETE操作,您可能仍需要在BEFORE触发器中执行此操作。