php mysql_insert_id 在多行上?

Posted

技术标签:

【中文标题】php mysql_insert_id 在多行上?【英文标题】:php mysql_insert_id on multiple rows? 【发布时间】:2010-12-13 08:26:52 【问题描述】:

是否可以从插入多行的查询中获取自动递增的 ID? 例如:

INSERT INTO table (col1, col2) VALUES (1, 2), (3, 4), (5, 6);

或者,有没有办法在不向表中插入任何内容的情况下找到 NEXT 自动增量值?

谢谢

【问题讨论】:

【参考方案1】:

据我所知,auto_increment 不能填补 id 之间的空白,并且操作是原子的。所以你可以假设它们会排成一排。

【讨论】:

mysql 支持自动增量偏移(这在复制中更常见),因此连续 id 并不是所有环境中的保证。 你可以安全地假设 MySql 中following circumstances 下的连续 id:你正在使用 InnoDB,innodb_autoinc_lock_mode 设置为 0 或 1(默认)。【参考方案2】:

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

如果您使用单个 INSERT 语句插入多行,LAST_INSERT_ID() 仅返回为第一个插入行生成的值。

所以不,您无法轻松获得所有 id,但您可以假设它们是连续的。不过,您应该永远不要依赖假设。听起来您想猜测在批量插入之后会出现的下一个 id?如果是这样,甚至不要尝试这样做,而是想另一种方法来做你想做的任何事情。 :)

【讨论】:

【参考方案3】:

要获取下一个 auto_increment id,您可以使用:

SELECT auto_increment FROM information_schema.tables WHERE table_name = 'table-you-want-to-check';

但是,您可能不想在代码逻辑中依赖 auto_increment id 或 last_insert_id()。例如,假设两个人 A 和 B 几乎同时向您的数据库添加问题,并且您使用 last_insert_id() 来确定此人问题的 ID。当他们同时提交问题时会发生什么? last_insert_id() 是来自 A 还是 B?

解决此问题的一种方法是使用“预定义”id 或guid 来补充或代替自动递增的 id。

【讨论】:

以上是关于php mysql_insert_id 在多行上?的主要内容,如果未能解决你的问题,请参考以下文章

mysql : 使用任何命令代替 mysql_insert_id();在 PHP 中?

在php连接数据库中,怎么获取某一个表的某个列的id号?

将带有 .php 的 mysql_insert_id() 的 id 传递给另一个 .php

存储过程和 mysql_insert_id 问题

mysql_insert_id 替代 postgresql

如何在onbeforeunload上执行ajax函数?