gpt4 book ai didi

mysql - LAST_INSERTED_ID 的安全性

转载 作者:行者123 更新时间:2023-11-29 12:29:34 24 4
gpt4 key购买 nike

给定两个表,其中表 A 有一个自增唯一 ID,用作表 B 中的主键,如果我们想编写一个触发器,让表 B 插入到表 A 中,然后再应用插入命令表B,使用LAST_INSERTED_ID函数获取表A中插入记录对应的自增值是否安全?我所说的安全性是指,如果在极短的时间间隔内将两条记录插入到表 A 中,则第二次插入(由第二个用户在另一个事务中执行)是否会影响 LAST_INSERTED_ID 的返回值功能?

如果确实如此,获取特定插入命令的自动增量值的更安全方法是什么?

最佳答案

LAST_INSERT_ID 只能看到在调用它的同一客户端 session 中生成的值。如果同一个 session 执行两个单独的 INSERT 语句,则第二个语句跟在第一个语句之后的速度有多快并不重要。每个连接有一个线程,一次一个语句,并且 LAST_INSERT_ID()(不带参数)将始终返回第一个 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 .

关于mysql - LAST_INSERTED_ID 的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27759655/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com