PDO - 用于多个插入查询的lastInsertId()

Mav*_*ick 9 mysql pdo lastinsertid last-insert-id

我可以将2个宠物插入表中,并获取它们的lastInsertId()以便一次进行一次处理(2个查询).
我想知道如果我在1个查询中插入2行,是否有办法获取两个lastInsertIds()并将它们分配给变量:

$query = "INSERT INTO pets (pet_name) VALUES (':coco'),(':jojo')";
$pet_insert = $dbh->prepare($query);
$pet_insert->execute(array(':coco' => $coco,':jojo' => $jojo));
$New_PetID = $dbh->lastInsertId();
Run Code Online (Sandbox Code Playgroud)

是否可以为coco和jojo获取lastInsertId()?所以类似于:

$New_PetID1 = $dbh->lastInsertId();//coco
$New_PetID2 = $dbh->lastInsertId();//jojo
Run Code Online (Sandbox Code Playgroud)

这将提供相同的ID,以获得2个ID的任何方式?仅供参考,这是一个try块.

zer*_*kms 14

这是不可能的.如果您需要为两行生成ID,则需要执行2次分隔INSERT

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

http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id


Pey*_*ahy 6

你可以添加1到最后一个插入ID来实现真正的最后一个记录id.如果你插入超过2个记录只需添加rowCount - 1到last_insert_id.

将innodb_autoinc_lock_mode设置为0("传统")或1("连续")时,任何给定语句生成的自动递增值将是连续的,没有间隙,因为表级AUTO-INC锁定一直保持到结束声明,一次只能执行一个这样的声明.

生成的ID在每个连接的基础上在服务器中维护.这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值.此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT值.此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务.

了解更多信息,请阅读本文档http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html

  • @zerkms谢谢你,这对我来说是一个很好的灵感. (2认同)
  • @IStranger ...确实,当显式插入 auto_increment Id 时,代码将不起作用。但如果你让 mysql 管理 auto_increment id,这种方法就可以正常工作。 (2认同)