检索多行的最后插入的ID

时间:2009-08-16 20:06:23

标签: php sql mysql

当将数据插入到具有自动递增PK的表中时,我需要获取该密钥以用于另一个语句。正如许多问题所显示的那样,可以使用mysql_insert_id()在PHP中完成。

但是,我一直在将插件分组,所以我一次插入多行。我这样做是因为我猜测可能存在一些性能问题,请告知我是否错了。无论如何,据我所知,mysql_insert_id()只返回最后一个id,当我需要所有插入行的ID时。

我想在这种情况下我可以:

  1. 使用mysql_insert_id()和我输入的行数来计算所有ID的一些简单数学。但这保证是否始终正确?

  2. 使用多个插入语句,每行一个

  3. 之前生成我的ID,不使用自动增量。

  4. 我确信这一定是一个经典问题,所以我想知道最常见和最可行的方法是什么。

2 个答案:

答案 0 :(得分:33)

调用last_insert_id()会为您提供最后一批中插入的第一行的ID。所有其他插入,保证是顺序的。

除非你做一些非常奇怪的事情,否则这可以让你轻松地计算每一行的ID。

实际上,行为在5.1中有所不同,具体取决于innodb自动增量模式参数的设置;这应该不重要。只要您不从默认值更改它,您就会看到预期的行为。

偶尔会出现这种情况,这种情况并不符合您的预期,也没有用处 - 例如,如果您执行ON DUPLICATE KEY UPDATE或INSERT IGNORE。在这些情况下,您需要执行其他操作来计算每行的ID。

但对于一个简单的vanilla批处理,没有为auto-inc列指定值,这很容易。

auto-increments are handled in innodb is here

的完整说明

答案 1 :(得分:2)

如果我是我,我会使用几种方法:

首先,CreateDate字段的默认值为CURRENT_TIMESTAMP。您基本上选择CURRENT_TIMESTAMP来获取日期,运行插入,然后选择select id from table where CreateDate > $mytimestamp

其次,您可以在表上创建一个触发器来记录after insert并将新ID放在一个小的审计表中。但是,在检查这些ID之前截断表。如果你的表是数百万行,我会使用这种方法。