【发布时间】:2014-07-11 12:59:52
【问题描述】:
如果没有插入行,是否应该触发触发器(AFTER INSERT)?
即使没有使用INSERT IGNORE ... 或INSERT ... ON DUPLICATE KEY UPDATE ... 插入行,也会触发触发器。
这种行为正常吗?
AFTER INSERT 是指在插入一行之后,还是在进行 INSERT 查询之后?
测试显示第二个,但为什么呢?
【问题讨论】:
如果没有插入行,是否应该触发触发器(AFTER INSERT)?
即使没有使用INSERT IGNORE ... 或INSERT ... ON DUPLICATE KEY UPDATE ... 插入行,也会触发触发器。
这种行为正常吗?
AFTER INSERT 是指在插入一行之后,还是在进行 INSERT 查询之后?
测试显示第二个,但为什么呢?
【问题讨论】:
AFTER INSERT 是指在插入一行之后,还是在 INSERT 之后 有查询吗?
每MySQL Spec(具体摘录)
触发器语法:trigger_time: { BEFORE |之后}
trigger_time 是触发动作时间。它可以是之前或之后 表示触发器在每一行之前或之后激活 修改。
•INSERT:只要将新行插入到 桌子;例如,通过 INSERT、LOAD DATA 和 REPLACE 语句。
这样,在插入行后触发器就会被激活。
您看到的行为在 MySQL 文档中也有注释
一个可能令人困惑的例子是 INSERT INTO ... ON DUPLICATE KEY UPDATE ... 语法:BEFORE INSERT 触发器激活 每一行,后跟一个 AFTER INSERT 触发器或两者 BEFORE UPDATE 和 AFTER UPDATE 触发器,取决于是否有 是该行的重复键。
【讨论】:
INSERT: The trigger activates whenever a new row is inserted into the table; ... - 更新的行(由于重复键),或者如果指定了IGNORE 则跳过的行算作插入行?
For, INSERT INTO ... ON DUPLICATE KEY UPDATE a BEFORE INSERT trigger activates for every row, followed by either an AFTER INSERT trigger or both