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