Last_insert_id 的效率如何?

Posted

技术标签:

【中文标题】Last_insert_id 的效率如何?【英文标题】:How efficient is Last_insert_id? 【发布时间】:2015-07-12 08:37:24 【问题描述】:

我最近遇到了一个问题,我需要能够获取我在页面上插入的查询的最后一个 ID。这个过程很简单,但我想对这个过程是如何完成的有一些保证。以下是我的代码:

$query30 = $db->query("INSERT `mybb_quickexample` SET `player1` = '".$row19[username]."', `player2` = '".$row18[username]."', `games` = '".$numberofgames."'")or die(       mysqli_error());

如您所见,我刚刚在 mybb_quickexample 中插入了一些内容,然后生成了一个 ID。现在在它正下方的代码中,我尝试找到ID。

$mmid = $db->insert_id(); 

foreach($_POST['optiontitle'] as $val)
$val = $db->escape_string($val); //
echo $val;
$query30 = $db->query("INSERT `mybb_quickexample2` SET `gid` = '".$id."', `mid` = '".$mmid."', `optiontitle` = 'OPTION TITLE', `option1` = '$val'")or die(      mysqli_error());


如您所见,它获取最近的 ID 并将其放入新表中。允许这两张表在我需要时相互对应。

但是,insert_last_id 是抓取页面上插入数据库的最后一行还是插入数据库的最后一行?现在我不完全确定这背后的机制,但我问这个是因为,如果一个人与另一个人同时加载这个页面怎么办?是否会有不匹配的 ID 抓取或代码仍然有效?

【问题讨论】:

kera.name/articles/2011/08/one-less-bug-to-worry-about的可能重复 @LightnessRacesinOrbit 这不是 *** 帖子。 可能重复 ? 【参考方案1】:

insert_last_id 返回最后插入的同一 SQL 会话/连接的 ID(请参阅MySQL manual)。 - SQL 服务器不知道您的页面。只要连接/会话不共享,就没有问题(例如竞争条件)。

也可以仅使用 SQL 获取最后插入的 ID:select LAST_INSERT_ID(); 或直接在以下 SQL 查询中使用它,以减少客户端-服务器往返,如 insert table B set foreign_id=LAST_INSERT_ID(),data="something";(但请注意,如果以下SQL 语句还有一个自动递增列,下一次 LAST_INSERT_ID() 调用将返回最新插入的 ID;请参阅 MySQL manual)

【讨论】:

真的吗?在今天之前我从未听说过 insert_last_id 这是以线程安全的方式获取最新插入的 ID 的唯一方法(不锁定表)。【参考方案2】:

其他人指出,每个 MySQL 连接都会维护 LAST_INSERT_ID。它使用连接中的自动递增值捕获最近插入中使用的实际 id。也就是说,即使其他连接也在进行大量插入,它也会做正确的事情。 (在同时为多个用户提供服务的繁忙网站上可能是这样。)

如果您需要在插入中使用它,您可以直接执行此操作,而无需与客户端进行任何形式的往返。例如,您可以从程序中依次发出两个查询

INSERT INTO person (first, last) 
            VALUES ('Jack', 'Straw');

INSET INTO address (person_id, addr, town) 
            VALUES (LAST_INSERT_ID(),'10 Downing St', 'London');

看看它是如何工作的?您可以使用它在插入值列表中提供值。当你以这种方式使用它时,它是 MySQL 中最简单、最有效的东西之一。

【讨论】:

【参考方案3】:

有些库可能会自动检索last-insert-id,无论您是否询问它们,在这种情况下调用它总是安全的(因为没有针对数据库的额外请求)。

在相反的情况下,它返回连接的最后一个 id。如果连接是共享的,那么最好将其包装在事务中。

【讨论】:

以上是关于Last_insert_id 的效率如何?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何选择last_insert_id?

如何最有效地获取多个 last_insert_id

MYSQL LAST_INSERT_ID 未按预期工作。我该如何解决?

使用 LAST_INSERT_ID 插入

如何从 LAST_INSERT_ID(`my_column`+1) 获取表达式的值?