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)
给定两个 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)