插入指向错误的 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()
PHP - 插入并将 LAST_INSERT_ID() 保存到变量中
插入许多行,LAST_INSERT_ID 返回 1 [重复]