首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL LAST_INSERT_ID()与多条记录INSERT语句一起使用

MySQL LAST_INSERT_ID()与多条记录INSERT语句一起使用
EN

Stack Overflow用户
提问于 2011-01-09 10:41:49
回答 3查看 31.9K关注 0票数 44

如果我使用执行单个记录插入的循环插入多个记录,则正如预期的那样,最后返回的插入id是最后一个。但如果我执行多记录insert语句:

代码语言:javascript
运行
复制
INSERT INTO people (name,age)
VALUES ('William',25), ('Bart',15), ('Mary',12);

假设上面的三条记录是插入到表中的第一条记录。在insert语句之后,我期望最后一个insert id返回3,但它返回1。

因此,有人可以确认这是否是LAST_INSERT_ID()在多记录INSERT语句上下文中的正常行为。这样我的代码就可以建立在它的基础上。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-01 05:00:48

是。last_insert_id()的这一行为是documented in the MySQL docs

重要

如果使用单个INSERT语句插入多个行,则LAST_INSERT_ID()仅返回为第一个插入的行生成的值。这样做的原因是可以在其他服务器上轻松地重现相同的INSERT语句。

票数 44
EN

Stack Overflow用户

发布于 2011-01-09 11:44:39

MySQL的man page中提到了此行为。它在评论中,但没有受到挑战,所以我猜这是预期的行为。

票数 2
EN

Stack Overflow用户

发布于 2018-09-21 22:16:23

我认为,如果您的表具有唯一的自动增量列(ID),并且您不要求mysql本身返回它们,那么这是可能的。我会花费你3个以上的数据库请求和一些处理。它将需要以下步骤:

  1. Get“在MAX(ID)之前”就在您的insert之前:

代码语言:javascript
运行
复制
    SELECT MAX(id) AS before_max_id FROM table_name`

  1. 进行多次插入...VALUES ()查询您的数据并保留它们:

INSERT insert INTO table_name (col1,col2) VALUES ("value1-1“,"value1-2"),("value2-1”,"value2-2"),("value3-1“,"value3-2"),ON DUPLICATE KEY UPDATE

  • Get "After MAX(ID)”紧跟在插入之后:

从table_name`

  • Get记录中选择MAX(id)作为after_max_id,其ID介于"Before MAX(ID)“和"After MAX(ID)”之间,包括:

id<=$after_max_id`

  • Do * FROM table_name WHERE id>$before_max_id和SELECT检查检索到的数据与您插入的数据进行匹配,并删除任何不是您插入的记录。其余记录具有您的ID:

代码语言:javascript
运行
复制
    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()。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4637367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档