如何从MySQL表中获取最后插入的ID

8

我正在运行一个 PHP 脚本,需要获取订阅表中最后一条插入的 ID。通过使用这个 ID ,我想为该订阅制作通知备注。

我使用了以下代码:

SELECT LAST_INSERT_ID() FROM subscription

我得到的是0而不是真正的最后插入的值。

2
LAST_INSERT_ID()连接特定的。确保在查询之间不要关闭连接并打开新连接,或尝试从单独的脚本调用此函数。 - Sammitch
6个回答

10
如果您使用 php 连接到 mysql,则可以使用 mysql_insert_id() 指向最近插入的 id。
像这样:
mysql_query("INSERT INTO mytable (1, 2, 3, 'blah')");
$last_id = mysql_insert_id();

看这个:mysql_insert_id()


5

LAST_INSERT_ID() 返回上一次插入语句的最后一个id。如果您想要最近插入的记录并且使用自增主键,则可以使用以下代码:

SELECT MAX( id ) FROM subscription;

如果您需要知道下一个 ID 是什么,您可以从 INFORMATION_SCHEMA 中获取该信息。
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'test'

mysql_insert_id

的翻译是:

mysql_insert_id


1
+1 但是MAX(id)不一定接近自动递增将生成的下一个值,因为有人可能已经从表的末尾删除了一些行。 - Bill Karwin
@BillKarwin OP并没有询问下一个id将是什么。 - Binary Alchemist
1
是的,我明白您的意思,但是仍然有可能(虽然很少见)LAST_INSERT_ID()返回的值比MAX(id)还要高,如果您刚插入的行被删除了。 - Bill Karwin
1
此外,如果其他会话也在插入自己的行,则MAX(id)可能返回比您刚刚插入的值更大的值。 - Bill Karwin

3
这个问题已经被回答了很多次:MySQL: LAST_INSERT_ID() 返回 0 你正在错误的上下文中使用该函数。只有在您紧接着插入一行时,它才能正常工作:
INSERT INTO 'subscription' (name) VALUES ('John Smith');
SELECT LAST_INSERT_ID() FROM subscription

您可以选择具有最高ID的行,这在逻辑上应该是最近添加的行...

SELECT MAX( id ) FROM subscription;

然而,标准方法是简单地调用 mysqli_insert_idmysql_insert_id(取决于您是否使用 mysqli 或 mysql PHP 库。我应该补充说,mysql 库非常不建议使用,因为它几乎已经被弃用)。下面是整个过程的理想示例:

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$mysqli->query("INSERT INTO 'subscription' (name) VALUES ('John Smith');");
printf ("New Record has id %d.\n", $mysqli->insert_id);
//Output is something like: New Record has id 999

如果您在同一脚本中没有插入订阅以收集最新的行ID,则使用“select max”方法。鉴于您提到了“1个脚本”,这似乎不太可能发生。此外,如果您的ID不是连续的,或者没有ID字段,或者您的行ID比刚刚添加的高,那么您应该考虑使用“date_added”列来确定哪一个是真正的最新记录。然而,这些情况很少发生。

3

这是更好的方法,2和3都可行,但MAX(id)需要更多时间来执行。

  1. SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'dbName' AND TABLE_NAME = 'tableName';

  2. SELECT tableName.id FROM tableName ORDER BY tableName.id DESC LIMIT 0,1;

  3. SELECT MAX( id ) FROM tableName;


1
此解决方案必须小心使用,因为两个(或更多)并发事务可能会获得相同的值。 - hdvianna

1
$last_id=mysql_query("SELECT id FROM `table_name` ORDER BY id DESC LIMIT 0 , 1" );
$row=mysql_fetch_assoc($last_id);
echo $row['id'];

在数据库中,将id替换为您的ID字段名称,将table_name替换为您的表名称。


1
这将始终为您提供最大的id,它表示最大的数字是最后插入的一个。
 SELECT MAX(id) as MaximumID FROM subscription;

6
是的,它将是最大的值,但如果其他会话也在插入,则MAX(id)不一定会返回由您的会话生成的最后一个值。 - Bill Karwin
我觉得你是对的。 - Mubo
此外,如果您在最大ID已经是“100”时手动插入值“10”而忽略了auto_increment,那么您的方法也会失败。 - halfpastfour.am

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接