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

时间:2013-07-22 18:11:47

标签: mysql

我正在运行此触发器

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添加到我的触发器中吗?。

1 个答案:

答案 0 :(得分:5)

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

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

如果您想要的是实际分配的值刚刚插入的行id列(无论是自动生成的还是 ,或INSERT语句是否插入多行),执行此操作:

SET the_last_inserted_id = NEW.id;

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

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

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