我可以插入2个宠物进入一个表,并在同一时间(2个查询)获得他们lastInsertId()进行进一步的处理一个。
我想知道如果有一种方法可以得到两个lastInsertIds(),并将其分配给变量,如果我在1个查询插入2行:
$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();
是否有可能得到lastInsertId()的椰子和乔乔? 因此,像:
$New_PetID1 = $dbh->lastInsertId();//coco
$New_PetID2 = $dbh->lastInsertId();//jojo
这将给予相同的ID,任何方式获得的ID 2? 仅供参考,这是一个try块。
Answer 1:
这是不可能的。 如果您需要生成的ID为两行-您需要执行2个独立的INSERT
重要如果您插入使用一个INSERT语句多行,LAST_INSERT_ID() 只返回第一个插入的行所产生的价值。 这样做的原因是为了使其能够轻松地复制同样的INSERT语句对一些其他的服务器。
http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_last-insert-id
Answer 2:
你可以加1,最后插入id来实现真正的最后一条记录id.and如果插入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
Answer 3:
请你,请避免布鲁斯给出解决方案的类型。 自动增量值可以被设置为在主站的情况下,以主复制比1。例如不同。 一会儿又回到了我们的应用上改变了他们的分贝安装程序运行的主机。 我碰巧coincidence-到-purely注意到,一下子ID的增加有两个而不是之一。 我们将不得不这样就可能造成我们严重问题的任何代码。
Answer 4:
该文件规定: Returns the ID of the last inserted row or sequence value
您将需要执行两个查询来获取ID为每个插入行。
Answer 5:
那么,既然1000点的插入比1个将更长一点,话题的问题仍然是有趣的。 可能的解决方法是使2个查询。 第一种是插入1000行,第二个是选择他们,如果有东西在这些插入的行唯一的。 例如宠物:
INSERT INTO pets ( name ) VALUES ( 'coco', 'jojo' );
SELECT id FROM pets WHERE name IN ( 'coco', 'jojo' );
这可能仅适用于大数据集给好处。
Answer 6:
我想假设是不可能,直到我试图对我自己想通, 这是可能的 。
每次执行后,添加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)
)
我希望这将帮助其他人谁正在寻求正确的答案。
Answer 7:
你可以使用“multi_query()”添加所有查询到像一个变量:“SQL1 $ =‘第一次插入’;” '$ SQL2 = “第二插入”;' '$ SQL3 = “第三插件”;' 等等......采取插入你要让数的计数。 使用“multi_query()”现在执行所有的“$ SQL的查询。 获得最后插入的ID。 现在,所有你需要做的是 '$ rowno = $ lastinsertid - $ countofinserts'。 所以基本上你会得到一个号码。 把它加1,并从所得数目的lastinsertid你跑插入查询的插入的id
Answer 8:
我的方法不解决这个问题,但是大概可以为一些类似的案件有帮助的。
当我需要插入大量的行列表:
- 我删除
AUTO_INCREMENT
从PrimaryKey的列中,更改其类型为bigint。 - 准备使用独特的PK值的列表
UUID_SHORT()
函数。 对于使用单查询使用创建列表:
( SELECT UUID_SHORT() ) UNION
( SELECT UUID_SHORT() ) UNION
( SELECT UUID_SHORT() ) # UNION (...
插入带有此准备PK列表行。
这种方法,当我需要插入相关数据(例如,准备PK名单将在插入使用结合表行)特别方便。
Answer 9:
我使用的阵列中的第一条语句,并在第二个加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;
}
}
Answer 10:
有可能的! 所有你需要做的是调用PDO lastInsertId()方法。 做多或批量插入时,这将返回第一个插入的ID。 接下来,我们需要与受上一INSERT语句的行数进行简单的加减运算。
$firstInsertedId = $this->lastInsertId();
$InsertedIds = range($firstInsertedId, ($firstInsertedId + ($stmt->rowCount() - 1)) );
print_r($InsertedIds);
文章来源: PDO - lastInsertId() for multiple insert query