如何从事务中的特定查询中检索 last_insert_id?

Posted

技术标签:

【中文标题】如何从事务中的特定查询中检索 last_insert_id?【英文标题】:How can I retrieve a last_insert_id from a specific query in a transaction? 【发布时间】:2012-07-18 17:34:35 【问题描述】:

我有一个包含三个查询的 mysql 事务

在第三个查询中,我试图从前两个查询中提取 last_insert_id 值。

VALUES ('".$result1[last_id]."','".$result2[last_id]."')";

但它不起作用。有什么建议吗?

【问题讨论】:

在事务中使用时,提交前必须调用last_insert_id 数组键应该被引用。除非它们在双引号字符串上下文中。您的示例中的引号和连接上下文切换是多余的。 @laxus:不,您可以插入事务,并且仍然提取 id - 您必须能够做到这一点。但是您不能进行多次插入,然后拉起 n-2 或更早插入的 id。 【参考方案1】:

您应该首先获取最后一个插入 ID,然后将其注入到查询中。假设您正在使用 mysql_ 函数:

mysql_query($query1);
$id1 = mysql_insert_id();

mysql_query($query2);
$id2 = mysql_insert_id();

$query3 = "INSERT INTO ... VALUES (".$id1.", ".$id2.");";
mysql_query($query3);

【讨论】:

我认为是mysql_ 是的,OP 可能正在使用它们,但是提醒这些功能不好的注释永远不会受到伤害。【参考方案2】:

假设您使用的是 MySQL 数据库。你可以像这样得到 id:

mysql_query($first_query);
$first_result_id = mysql_insert_id();

mysql_query($second_query);
$second_result_id = mysql_insert_id();

$third_query = "INSERT INTO table  (column1, column2) VALUES (".$first_result_id .", ".$second_result_id .");";
mysql_query($third_query);

希望对你有帮助

【讨论】:

【参考方案3】:

你可以使用 MySQL 来

SELECT LAST_INSERT_ID()

这将检索给定事务中的最后一个插入 ID。您也可以在其他 DBMS 中执行此操作,但显然您使用的是 MySQL。

既然如此,php 中的 MySQL API 也有这方面的快捷方式:

//mysql_*
$id = mysql_insert_id();

//PDO
$pdo = PDO_OBJECT;
$pdo->query();
$id = $pdo->lastInsertId();

//mysqli
$my = MYSQLI_OBJECT;
$my->query();
$id = $my->insert_id;

注意: @HopeIHelped 的回答具有误导性。只要您在同一事务中,就没有竞争条件。 LAST_INSERT_ID() 检索给定事务中的最后一个 ID(上面的 API 也是如此),因此即使您让此文件同时运行大量事务和互锁查询,您也可以安全地使用它们。

【讨论】:

以上是关于如何从事务中的特定查询中检索 last_insert_id?的主要内容,如果未能解决你的问题,请参考以下文章

检索Solr查询中的特定字段?

firebase 查询如何从子项中检索两个特定值

本机查询 - 如何仅从数据库中检索实体的特定列

检索递归 SQL 查询中的特定级别

如何从Swift中的Cloud FireStore Firebase访问特定字段

如何从较大列表中的特定列表中检索特定值?