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

You*_*now 1 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 ;
Run Code Online (Sandbox Code Playgroud)

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

为了解决这个问题,我做了,SELECT LAST_INSERT_ID()+1 INTO the_last_inserted_id;但这不是一个真正的修复,因为我不知道为什么触发器不能正常工作.这里有一个类似的问题,但我不明白.我应该总是添加1到我的触发器喜欢我这样做的方式?

spe*_*593 5

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

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

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

SET the_last_inserted_id = NEW.id;
Run Code Online (Sandbox Code Playgroud)

这得到了分配给该行的实际值(在每个行的每个行更新触发器中.在BEFORE UPDATE ... FOR EACH ROW触发器中,实际上可以修改该值.)

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

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