我正在运行此触发器
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
添加到我的触发器中吗?。
答案 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