插入指向错误的 last_insert_id() 后触发

Posted

技术标签:

【中文标题】插入指向错误的 last_insert_id() 后触发【英文标题】:Trigger after insert points to the wrong last_insert_id() 【发布时间】:2013-07-22 18:11:47 【问题描述】:

我正在运行这个触发器

DELIMITER //
CREATE TRIGGER lestrigger
    AFTER INSERT ON examinations
   FOR EACH ROW
  BEGIN
    DECLARE the_last_inserted_id INT;
    SELECT LAST_INSERT_ID() INTO the_last_inserted_id;

END //
DELIMITER ;

插入后,last_inserted_id 变量保存前一个插入的last_insert_id,而不是当前插入。

为了解决这个问题,我做了SELECT LAST_INSERT_ID()+1 INTO the_last_inserted_id; 但这并不是真正的解决方法,因为我不知道为什么触发器不能正常工作。有一个similar question here 但我不明白。应该我总是像我做的那样将1 添加到我的触发器中?。

【问题讨论】:

"LAST_INSERT_ID()(不带参数)返回一个 BIGINT(64 位)值,表示最近为 AUTO_INCREMENT 列设置的第一个自动生成的值执行INSERT 语句来影响这样的列。“因此你不能用它来得到你想要的;但是,正如您所链接的答案所暗示的那样,您可以使用 NEW 表别名来访问已分配给您的 AUTO_INCREMENT 列的值。 【参考方案1】:

不,不要在触发器中为 last_insert_id() 添加 1。

在多用户、多线程环境中,您不能保证(也不能期望)这将为您获得分配给刚刚插入的行的 id 值。 (INSERT 语句可以插入多行,并且可以提供 ID 的值,这样它就不会自动生成。)

如果您想要的是实际分配刚刚插入的行id列的值(无论是自动生成的,还是INSERT 语句是否插入了多行),这样做:

SET the_last_inserted_id = NEW.id;

获取分配给行的实际值(在 AFTER UPDATE FOR EACH ROW 触发器中。在 BEFORE UPDATE ... FOR EACH ROW 触发器中,实际上可以修改此值。 )

你观察到的行为没有错;这是我们所期望的。 LAST_INSERT_ID() 函数的行为在这里有很好的记录:

http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id

【讨论】:

以上是关于插入指向错误的 last_insert_id() 后触发的主要内容,如果未能解决你的问题,请参考以下文章

使用 LAST_INSERT_ID 插入

多次插入后更新特定记录 - 可能使用 last_insert_id()

PHP - 插入并将 LAST_INSERT_ID() 保存到变量中

插入许多行,LAST_INSERT_ID 返回 1 [重复]

MYSQL:存储过程,插入一行,然后通过 LAST_INSERT_ID() 选择它

Last_insert_id 为带有字母和数字的自动递增列返回 0