如何在多条记录插入中获取最后插入的 id?

Posted

技术标签:

【中文标题】如何在多条记录插入中获取最后插入的 id?【英文标题】:how get last inserted id in multiple record insert? 【发布时间】:2015-06-24 13:57:12 【问题描述】:

我正在尝试编写一个标签系统,我希望它允许用户在文本输入中插入多个标签。然后我想在tag_table 中插入每个标签,并需要将它们的ID 保留在tag_post_table 中。

我知道在多次插入last_insert_id 返回第一条记录id。我可以将标签计数添加到last_insert_id 以获取真正的最后一个 id 并使用它们之间的每个 id 吗?这可靠吗?

我看过这篇文章,但我没有完全理解它

http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html

【问题讨论】:

只能获取第一行的插入id。可以通过使用innodb_autoinc_lock_mode 选项(可能还有其他设置)来确保 id 是连续的,但我没有尝试过,很难正确测试。 ***.com/questions/4637367/…的可能重复 【参考方案1】:

据我了解this article:

innodb_autoinc_lock_mode 设置为 0(“传统”)或 1(“连续”),任何给定语句生成的自动增量值将是连续的,没有间隙,因为表级 AUTO-INC 锁是一直保持到语句结束,并且一次只能执行一个这样的语句。

innodb_autoinc_lock_mode 设置为 0 或 1 可确保自动添加的 id 是连续的。

因此,您从LAST_INSERT_ID 获得的 ID 是新 ID 中的第一个,LAST_INSERT_ID +“受影响的行数”是新 ID 中的最后一个。

另外LAST_INSTERT_ID不受其他连接影响

生成的 ID 在每个连接的基础上在服务器中维护。这意味着函数返回给给定客户端的值是为影响该客户端的 AUTO_INCREMENT 列的最新语句生成的第一个 AUTO_INCREMENT 值。此值不受其他客户端的影响,即使它们生成自己的 AUTO_INCREMENT 值。这种行为确保每个客户端都可以检索自己的 ID,而不用担心其他客户端的活动,也不需要锁或事务。

但请注意,如果您使用INSERT ... ON DUPLICATE KEY UPDATEINSERT IGNORE ...,可能会出现错误的结果。但我还没有测试过。

【讨论】:

以上是关于如何在多条记录插入中获取最后插入的 id?的主要内容,如果未能解决你的问题,请参考以下文章

Informix:如何获取最后插入记录的 id

如何在laravel中插入多条记录而不循环

如何插入多条记录并获取标识值?

如何在使用 PHP-PDO 记录查询时获取最后一个插入 ID

如果同时插入两条记录,如何获取最后一个ID

使用 NodeJS 在 mySQL 中插入多条记录以防止注入并获取每条记录的 ID