10

我可以将 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();

是否可以获得 coco 和 jojo 的 lastInsertId() ?所以像:

$New_PetID1 = $dbh->lastInsertId();//coco
$New_PetID2 = $dbh->lastInsertId();//jojo

这将给出相同的 ID,有什么方法可以获得 2 个 ID?仅供参考,这是在 try 块中。

4

9 回答 9

16

这是不可能的。如果您需要为两行生成 id - 您需要执行 2 个分隔INSERT

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

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

于 2012-09-25T00:31:08.903 回答
9

您可以将 1 添加到最后插入 id 以实现真正的最后一条记录 id。如果您插入超过 2 条记录,只需将 rowCount - 1 添加到 last_insert_id。

将 innodb_autoinc_lock_mode 设置为 0(“traditional”)或 1(“consecutive”),任何给定语句生成的自动增量值将是连续的,没有间隙,因为表级 AUTO-INC 锁一直保持到结束语句,并且一次只能执行一个这样的语句。

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

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

于 2015-06-26T03:35:05.910 回答
3

拜托,请避免布鲁斯给出的解决方案类型。自动增量值可以设置为不同于 1。例如在主到主复制的情况下。不久前,运行我们的一个应用程序的主机更改了它们的数据库设置。我碰巧注意到 - 纯粹是巧合 - 突然间,id 增加了 2 而不是 1。我们会有这样的代码吗?它可能会给我们带来严重的问题。

于 2014-04-17T11:33:55.517 回答
2

文档指出:Returns the ID of the last inserted row or sequence value

您将需要执行两个查询来获取每个插入行的 id。

于 2012-09-25T00:32:15.957 回答
1

我试图假设这是不可能的,直到我自己尝试并认为这是可能的。

每次执行后,添加 lastInsertId() 并分配一个键。

对于我的例子:

// First query
$sql = "INSERT INTO users
(username, email)
values
(:username, :email)";
$sth = $this->db->prepare($sql);
$sth->bindParam(':username', $data['username'], PDO::PARAM_STR);
$sth->bindParam(':email', $data['email'], PDO::PARAM_STR);

// Second Query
$sql2 = "INSERT INTO users
(username, email)
values
(:username, :email)";
$sth2 = $this->db->prepare($sql2);
$sth2->bindParam(':username', $data['username'], PDO::PARAM_STR);
$sth2->bindParam(':email', $data['email'], PDO::PARAM_STR);

// Start trans
$this->db->beginTransaction();

// Execute the two queries
$sth->execute();
$last['ux1'] = $this->db->lastInsertId(); // <---- FIRST KEY

$sth2->execute();
$last['ux2'] = $this->db->lastInsertId(); // <---- SECOND KEY

// Commit
$this->db->commit();

我能够检索最后插入的两个 ID

数组([创建] => 数组([ux1] => 117 [ux2] => 118)

)

我希望这将帮助其他正在寻求正确答案的人。

于 2014-05-30T00:01:25.830 回答
1

好吧,由于 1000 次插入比 1 次插入有点长,所以话题的问题仍然很有趣。可能的解决方法是进行 2 次查询。第一个是插入 1000 行,第二个是如果在这些插入的行中有独特的东西,则选择它们。以宠物为例:

INSERT INTO pets ( name ) VALUES ( 'coco', 'jojo' );
SELECT id FROM pets WHERE name IN ( 'coco', 'jojo' );

这只能为大数据集带来好处。

于 2013-12-04T10:32:03.833 回答
0

我在第一个语句和第二个 add 中使用了数组if condition。所以如果插入记录得到它的最后一个 id 然后做第二个语句。如果插入第二个数组得到它的最后一个 id 然后重复第二个语句

    for ($count=0; $count < count($_POST["laptop_ram_capacity"]); $count++) { 
        $stmt = $con->prepare('INSERT INTO `ram` 
                (ram_capacity_id, ram_type_id, ram_bus_id, ram_brand_id, ram_module_id)
                VALUES (?,?,?,?,?)');

            //excute query//
            $stmt->execute(array(
                            $_POST['laptop_ram_capacity'][$count],
                            $_POST["laptop_ram_type"][$count],
                            $_POST["laptop_ram_bus"][$count],
                            $_POST["laptop_ram_brand"][$count],
                            $_POST["laptop_ram_module"][$count]
                            ));
            //fetsh the data//
            $rows = $stmt->rowCount();
            // i add the below statment in if condition to repeat the insert and pass the repeated of the last statement//
            if ($rows > 0) {
            $LASTRAM_ID = $con->lastInsertId();

            $stmt = $con->prepare('INSERT INTO `ram_devicedesc_rel` 
                (ram_id, Parent_device_description_id)
                VALUES (?,?)');

            //excute query//
            $stmt->execute(array(
                            $LASTRAM_ID,
                            $LASTdevicedesc_ID
                            ));
            //fetsh the data//
            } else {
                echo "Error: " . $sql . "<br>" . $conn->error;
            }                                    
        }
于 2018-10-22T07:58:33.010 回答
-1

您可以使用 'multi_query()' 将所有查询添加到一个变量中,例如:'$sql1 = "first insert";' '$sql2 = "第二次插入";' '$sql3 = "第三次插入";' 依此类推...计算您要制作的插入数量。现在使用 'multi_query()' 执行所有的 '$sql' 查询。获取最后一个插入 id。现在你所要做的就是'$rowno = $lastinsertid - $countofinserts'。所以基本上你会得到一个数字。向它添加 1,从结果数字到 lastinsertid 是您运行的插入查询的插入 ID

于 2015-06-05T14:05:19.273 回答
-2

有可能的!您需要做的就是调用 PDO lastInsertId() 方法。这将在执行多个或批量 INSERT 时返回第一个插入的 id。接下来,我们需要对受最后一个 INSERT 语句影响的行数执行简单的加减运算。

$firstInsertedId = $this->lastInsertId();
$InsertedIds = range($firstInsertedId, ($firstInsertedId + ($stmt->rowCount() - 1)) );
print_r($InsertedIds);
于 2013-03-15T19:49:43.090 回答