Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL LAST_INSERT_ID()与多条记录INSERT语句一起使用_Mysql_Insert_Lastinsertid - Fatal编程技术网

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

MySQL LAST_INSERT_ID()与多条记录INSERT语句一起使用,mysql,insert,lastinsertid,Mysql,Insert,Lastinsertid,如果使用执行单个记录插入的循环插入多个记录,则返回的最后一个插入id将如预期的那样是最后一个。但如果我执行多记录插入语句: INSERT INTO people (name,age) VALUES ('William',25), ('Bart',15), ('Mary',12); 假设上面三条是表中插入的第一条记录。在insert语句之后,我希望最后一个insert id返回3,但它返回1。有关语句的第一个插入id 因此,请有人确认这是否是在多条记录INSERT语句的上下文中,LAST\u I

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

INSERT INTO people (name,age)
VALUES ('William',25), ('Bart',15), ('Mary',12);
假设上面三条是表中插入的第一条记录。在insert语句之后,我希望最后一个insert id返回3,但它返回1。有关语句的第一个插入id


因此,请有人确认这是否是在多条记录INSERT语句的上下文中,
LAST\u INSERT\u ID()
的正常行为。因此,我可以将代码建立在它的基础上。

MySQL的。它在评论中,但没有受到质疑,所以我猜这是预期的行为。

是的。
last\u insert\u id()
的这种行为是:

重要信息
如果使用单个语句插入多行,则仅返回为第一个插入行生成的值。这样做的原因是可以对其他服务器轻松地复制相同的语句


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

  • 在插入之前获取“在最大值(ID)之前”:
  • 像前面一样从表\u name中选择MAX(id)\u MAX\u id`
    
  • 进行多次插入。。。值()查询数据并保留它们:

    INSERT INTO table_name
    (col1, col2)
    VALUES 
    ("value1-1" , "value1-2"), 
    ("value2-1" , "value2-2"), 
    ("value3-1" , "value3-2"), 
    ON DUPLICATE KEY UPDATE
    
  • 插入后立即获取“在最大值(ID)之后”:

    SELECT MAX(id) AS after_max_id FROM table_name`
    
  • 获取ID介于“最大值之前(ID)”和“最大值之后(ID)”之间的记录,包括:

    SELECT * FROM table_name WHERE id>$before_max_id AND id<=$after_max_id`
    

    这就是普通人在现实世界中用部分代码来解决它的方式。由于autoincrement,它应该得到尽可能少的记录来进行检查,这样它们就不会需要大量的处理。这不是最终的“复制粘贴”代码-例如,您必须根据需要创建自己的函数compare_content()。

    您的表是否具有自动递增ID?后两个插入ID很容易计算。只需在第一条记录后为每条记录添加一条即可。@dqhendricks您确定ID正确吗?据我所知,innodb的insert不会锁定特定的ID集,另一个进程可能会在这两者之间插入一个条目,尽管我不确定
    insert中的多个值是否会这样。。。价值观…
    @TimoHuovinen-我同意并理解这种担忧。但是,我认为可以肯定的是,如果所有3个插入都发生在完全相同的insert语句中,那么它发生在同一事务中,因此在插入其他事务时,会从其他事务中排除所有其他插入。因此,同一语句中的插入总是直接跟随另一条语句,您可以放心地依靠以数字形式递增最后一个插入id来为后面的其他语句提供id。@FriendlyDev是的,您是对的,谢谢您的澄清。还有另一个注意事项:对于
    插入忽略
    插入。。。在重复密钥更新时
    MySQL不知道将插入的行数,因此它将增加并为InnoDB下的每个可能插入保留一个autoinc id。虽然我不确定分配的ID和间距是否与本例中
    值中的行的顺序相同。仅供参考:这种行为记录在实际的MySQL手册中,而不仅仅是用户注释中。有关详细信息,请参阅。