lastInsertId() 是不是获取该脚本或整体插入的最后一个 id?
Posted
技术标签:
【中文标题】lastInsertId() 是不是获取该脚本或整体插入的最后一个 id?【英文标题】:Does lastInsertId() get the last id inserted by that script or overall?lastInsertId() 是否获取该脚本或整体插入的最后一个 id? 【发布时间】:2014-01-17 16:49:48 【问题描述】:我想知道lastInsertId()
究竟是如何工作的。 Atm,我正在使用它来获取插入行的 id,因此我可以在代码的其他部分中使用此 id。例如:
$stmt = $db->prepare('INSERT INTO image_table (image_name, image_size) VALUES (:image_name, :image_size)');
$stmt->execute(array(
'image_name' => $photoName,
'image_size' => $image_size / 1024,
));
$lastInsertId = $db->lastInsertId('yourIdColumn');
好的,我的问题是:
1)此脚本是否为在该特定脚本中完成的 SQL 插入获取 lastInsertId
?
2) 会发生什么,例如,3 个不同的用户将数据插入同一个表中,相差几纳秒。像这样的:
this script -> Inserts to row id 1
Another user -> Inserts to row id 2
Another user -> Inserts to row id 3
在这种情况下,lastInsertId()
会返回值 1,因为它是该脚本插入的行的最后一个 id,还是返回 3,因为这是脚本到达时的最后一个 id执行lastInsertId()
函数的行?
【问题讨论】:
这是特定于会话的。 对于那个脚本/会话;不然就没用了 完美!感谢您的澄清....我很担心,因为如果它获取了整体 ID,那么在我的情况下它可能是一个安全问题。很高兴每个脚本/会话。 FWIW,您可以打开两个窗口并自己测试...或者您可以阅读documentation:“生成的 ID 保存在服务器中的 per-连接基础。” 因此,如果 LAST_INSERT_ID() 返回生成的 last id——即使它是 60 秒前——为什么需要测试这么快的时间?您可以通过在每个窗口中输入插入语句来测试它,然后在每个窗口中输入SELECT LAST_INSERT_ID()
(它们将返回两个不同的数字),然后在窗口 1 中再插入一行,在窗口 2 中再插入一行 SELECT LAST_INSERT_ID()
以演示窗口 2除了在自己的会话中生成的 id 之外,什么也看不到。此测试不需要精确计时。
【参考方案1】:
该脚本执行中 last sql 插入的 id(不是说另一个用户的另一个竞争插入)。
当您有 3 个 inserts 时,它会为您提供 lastInsertId() 就像它所说的那样,最后一个,不是全部 3 个,不是 2 个......只是最后一个.通过单独运行插入并获取 id 来解决此问题,或者如果您需要再次提取该数据,则只需根据插入条件进行搜索。 由不同的用户/会话插入,请参阅答案 #1,lastInsertId()
适用于特定的用户/会话/执行,不适用于所有操作。后台也发生了基本的 mysql 数据库临时操作,如果这是真的,它们会返回 id。
希望对您有所帮助。
【讨论】:
1 是正确的,实际上也回答了 2。 2 的答案不适用,因为问题是关于不同的用户,而不是关于同一脚本中的三个语句。 ...哎呀,我读到“如果我在表中插入 3 个用户会怎样”(1 个 sql 查询),将正确答案 我认为更好的答案是 lastInsertId 返回给定连接的最后插入 ID。我可以在同一个脚本中有许多数据库连接,每个连接都插入不同的信息(甚至是同一个数据库的多个数据库连接),并在每个脚本上调用 lastInsertId 并获得不同的结果。在这个意义上使用“用户”这个词有点模棱两可。术语会话更好,因为每个连接都有自己的会话。不过,+1,因为我相信您的回答能说明问题,而且我的问题纯粹是语义问题。 搭载@watcher,user
是错误的术语,特别是因为在数据库级别,您的站点可能只有一个用户连接到数据库。以上是关于lastInsertId() 是不是获取该脚本或整体插入的最后一个 id?的主要内容,如果未能解决你的问题,请参考以下文章
多线程单连接中的 PDO::lastInsertId() 是不是安全?