当将数据插入到具有自动递增PK的表中时,我需要获取该密钥以用于另一个语句。正如许多问题所显示的那样,可以使用mysql_insert_id()
在PHP中完成。
但是,我一直在将插件分组,所以我一次插入多行。我这样做是因为我猜测可能存在一些性能问题,请告知我是否错了。无论如何,据我所知,mysql_insert_id()
只返回最后一个id,当我需要所有插入行的ID时。
我想在这种情况下我可以:
使用mysql_insert_id()
和我输入的行数来计算所有ID的一些简单数学。但这保证是否始终正确?
使用多个插入语句,每行一个
之前生成我的ID,不使用自动增量。
我确信这一定是一个经典问题,所以我想知道最常见和最可行的方法是什么。
答案 0 :(得分:33)
调用last_insert_id()会为您提供最后一批中插入的第一行的ID。所有其他插入,保证是顺序的。
除非你做一些非常奇怪的事情,否则这可以让你轻松地计算每一行的ID。
实际上,行为在5.1中有所不同,具体取决于innodb自动增量模式参数的设置;这应该不重要。只要您不从默认值更改它,您就会看到预期的行为。
偶尔会出现这种情况,这种情况并不符合您的预期,也没有用处 - 例如,如果您执行ON DUPLICATE KEY UPDATE或INSERT IGNORE。在这些情况下,您需要执行其他操作来计算每行的ID。
但对于一个简单的vanilla批处理,没有为auto-inc列指定值,这很容易。
的完整说明答案 1 :(得分:2)
如果我是我,我会使用几种方法:
首先,CreateDate
字段的默认值为CURRENT_TIMESTAMP
。您基本上选择CURRENT_TIMESTAMP
来获取日期,运行插入,然后选择select id from table where CreateDate > $mytimestamp
。
其次,您可以在表上创建一个触发器来记录after insert
并将新ID放在一个小的审计表中。但是,在检查这些ID之前截断表。如果你的表是数百万行,我会使用这种方法。