【问题标题】:How to get last inserted id from table MySQL [duplicate]如何从表 MySQL 中获取最后插入的 id [重复]
【发布时间】:2014-01-20 10:16:10
【问题描述】:

我正在 php 中运行 1 个脚本,因为我需要在订阅表中最后插入 id。通过使用该 ID,我想为该订阅制作通知说明。

我用过:

SELECT LAST_INSERT_ID() FROM subscription

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

【问题讨论】:

  • LAST_INSERT_ID() 是特定于连接的。确保您没有关闭连接并在查询之间打开新连接,或者尝试从单独的脚本调用此函数。

标签: php mysql database


【解决方案1】:

如果您使用php 连接到mysql,您可以使用mysql_insert_id() 指向最后插入的ID。

像这样:

mysql_query("INSERT INTO mytable (1, 2, 3, 'blah')");
$last_id = mysql_insert_id();

看到这个:mysql_insert_id()

【讨论】:

    【解决方案2】:

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

    SELECT MAX( id ) FROM subscription;
    

    如果您需要知道 NEXT id 是什么,您可以从 INFORMATION_SCHEMA 获取此信息

    SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'test'
    

    mysql_insert_id

    【讨论】:

    • +1 但MAX(id) 不一定接近自动增量将生成的 next 值,因为有人可能从表的末尾删除了一些行.
    • @BillKarwin OP 没有询问 Next id 是什么。
    • 是的,点了,但如果您刚刚插入的行被删除,LAST_INSERT_ID() 仍然有可能(尽管很少见)返回高于 MAX(id) 的值。
    • 如果其他会话也插入自己的行,MAX(id) 也可能返回一个大于您刚刚插入的值的值。
    【解决方案3】:

    这个问题已经回答过很多次了:MySQL: LAST_INSERT_ID() returns 0

    您正在脱离上下文使用该功能。仅当您在此之前立即插入一行时,它才会起作用:

    INSERT INTO 'subscription' (name) VALUES ('John Smith');
    SELECT LAST_INSERT_ID() FROM subscription
    

    但是,您可以选择 id 最高的行,这在逻辑上是最近添加的...

    SELECT MAX( id ) FROM subscription;
    

    然而,标准方法是简单地调用 mysqli_insert_id 或 mysql_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 相同的脚本中插入订阅,请使用“选择最大值”方法。鉴于您提到了“1 个脚本”,这似乎不太可能

    此外,如果您的 ID 不连续,或者您没有 ID 字段,或者您的行 ID 高于您刚刚添加的行 ID,您可能应该考虑使用“date_added”列来确定哪一个真的是最新的。然而,这些情况不太可能发生。

    【讨论】:

      【解决方案4】:

      这是更好的方法 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;

      【讨论】:

      • 此解决方案必须谨慎使用,因为两个(或更多)并发事务可能会获得相同的值
      【解决方案5】:

      这将始终为您提供最大的 id,即最大的数字是最后插入的一个

       SELECT MAX(id) as MaximumID FROM subscription;
      

      【讨论】:

      • 是的,这将是最大的值,但如果其他会话也在插入,那么MAX(id) 不一定会返回你的会话生成的最后一个值。
      • 我认为你是对的。
      • 另外,如果您在最大 id 已经是 100 时手动插入值 10 来忽略 auto_increment,那么您的方法也会失败。
      【解决方案6】:
      $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 替换为您的表名。

      【讨论】:

        猜你喜欢
        • 2015-03-20
        • 2011-05-13
        • 2016-06-05
        • 2010-12-13
        • 2019-11-07
        • 2019-01-16
        • 1970-01-01
        • 2014-07-07
        • 1970-01-01
        相关资源
        最近更新 更多