LAST_INSERTED_ID 的安全

Safety of LAST_INSERTED_ID

给定两个 table,其中 table A 有一个自增唯一 ID,用作 table B 中的主键,如果我们想为table B 插入到 table A 之前,在 table B 上应用插入命令,使用 LAST_INSERTED_ID 函数获取相应的自动增量值是否安全到table A中插入的记录? Safety 我的意思是如果在极短的时间间隔内在 table A 中插入两条记录,第二次插入(由第二个用户在另一个事务中执行)是否会影响返回值LAST_INSERTED_ID函数?

如果有任何机会,获取特定插入命令的自动增量值的更安全方法是什么?

LAST_INSERT_ID 只能看到在调用它的同一客户端会话中生成的值。如果同一个会话执行两个单独的 INSERT 语句,则第二个跟第一个的执行速度无关紧要。每个连接一个线程,一次一个语句,并且 LAST_INSERT_ID() (没有参数)将始终 return 生成 first AUTO_INCREMENT 值通过 最近的 语句,不包括当前正在执行的语句。

According to the docs,使用触发器时仍然如此:

Within the body of a stored routine (procedure or function) or a trigger, the value of LAST_INSERT_ID() changes the same way as for statements executed outside the body of these kinds of objects.

但是LAST_INSERT_ID()触发器执行前后的值是一样的:

For stored functions and triggers that change the value, the value is restored when the function or trigger ends, so following statements do not see a changed value.

一旦您了解了这些规则,以下行为就不足为奇了:

CREATE TABLE t (a int primary key auto_increment, b int);

INSERT INTO t (b) VALUE (1);  -- (1, 1)

INSERT INTO t (b) VALUE (LAST_INSERT_ID());  -- (2, 1)

INSERT INTO t (b) VALUES
  (LAST_INSERT_ID()),  -- (3, 2) 
  (LAST_INSERT_ID()),  -- (4, 2)
  (LAST_INSERT_ID());  -- (5, 2)

INSERT INTO t (b) VALUE (LAST_INSERT_ID());  -- (6, 3)

这里是the above example on SQL Fiddle