Last_insert_id 的效率如何?

How efficient is Last_insert_id?

我最近遇到了一个问题,我需要能够获取我在页面上插入的查询的最后一个 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 并将其放入新的 table。允许这 2 table 稍后在我需要时相互对应。

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

insert_last_id return 是相同 SQL session/connection 的最后插入 ID(参见 MySQL manual)。 - SQL 服务器不知道您的页面。只要不共享 connection/session 就没有问题(例如竞争条件)。

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

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

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

其他人指出 LAST_INSERT_ID 是按 MySQL 连接维护的。它捕获最近插入中使用的实际 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 中最简单和最有效的东西之一。