2014-07-11 113 views
0

如果触发器(AFTER INSERT)被触发,如果没有行被插入?AFTER INSERT触发器和INSERT IGNORE/ON DUPLICATE KEY更新

即使没有行插入INSERT IGNORE ...INSERT ... ON DUPLICATE KEY UPDATE ...,触发器也会被触发。
这种行为是否正常?

AFTER INSERT意味着在插入行之后还是在INSERT查询完成之后?
测试显示第二个,但为什么?

回答

2

插入行后,或插入行后INSERT 查询完成后,AFTER INSERT是否意味着?

MySQL Spec(具体节选)

TRIGER语法:trigger_time:{BEFORE | AFTER}

trigger_time是触发器动作时间。它可以在之前或之后到 指示触发器在每行之前或之后激活为 修改。

•插入:无论何时将新行插入 表中,触发器都会激活;例如,通过INSERT,LOAD DATA和REPLACE语句。

这样,触发器在插入行后激活。

你AE眼见为实以及MySQL的文件中谈到的行为

这方面的一个潜在的混乱例子是INSERT INTO ... ON 重复键UPDATE ...语法:一个BEFORE INSERT触发器每行激活 ,然后是AFTER INSERT触发器,或者两者都是BEFORE UPDATE和AFTER UPDATE触发器,具体取决于 是否为该行的重复键。

+0

INSERT:无论何时将新行插入表中,触发器都会激活; ... - 执行更新的行(由于重复键),或者如果指定了'IGNORE',则跳过这些行,算作插入行? – undefined

+0

是的。查看MySQL文档回答中的最后一段摘录;它表示:对于INSERT INTO ... ON DUPLICATE KEY UPDATE,BEFORE INSERT触发器会激活每一行,然后是AFTER INSERT触发器或两者都启动 – Rahul