如果我使用执行单个记录插入的循环插入多个记录,则正如预期的那样,最后返回的插入id是最后一个。但如果我执行多记录insert语句:
INSERT INTO people (name,age)
VALUES ('William',25), ('Bart',15), ('Mary',12);
假设上面的三条记录是插入到表中的第一条记录。在insert语句之后,我期望最后一个insert id返回3,但它返回1。
因此,有人可以确认这是否是LAST_INSERT_ID()
在多记录INSERT语句上下文中的正常行为。这样我的代码就可以建立在它的基础上。
发布于 2011-11-01 05:00:48
是。last_insert_id()
的这一行为是documented in the MySQL docs
重要
如果使用单个INSERT
语句插入多个行,则LAST_INSERT_ID()
仅返回为第一个插入的行生成的值。这样做的原因是可以在其他服务器上轻松地重现相同的INSERT
语句。
发布于 2011-01-09 11:44:39
MySQL的man page中提到了此行为。它在评论中,但没有受到挑战,所以我猜这是预期的行为。
发布于 2018-09-21 22:16:23
我认为,如果您的表具有唯一的自动增量列(ID),并且您不要求mysql本身返回它们,那么这是可能的。我会花费你3个以上的数据库请求和一些处理。它将需要以下步骤:
SELECT MAX(id) AS before_max_id FROM table_name`
INSERT insert INTO table_name (col1,col2) VALUES ("value1-1“,"value1-2"),("value2-1”,"value2-2"),("value3-1“,"value3-2"),ON DUPLICATE KEY UPDATE
从table_name`
id<=$after_max_id`
foreach ($after_collection as $after_item) {
foreach ($input_collection as $input_item) {
if ( $after_item->compare_content($input_item) ) {
$intersection_array[] = $after_item;
}
}
}
这只是一个普通人在现实世界中用部分代码解决这个问题的方法。多亏了自动增量,它应该得到尽可能少的记录来进行检查,所以它们不会占用太多的处理时间。这不是最终的“复制和粘贴”代码-例如。您必须根据自己的需要创建自己的函数compare_content()。
https://stackoverflow.com/questions/4637367
复制相似问题