【问题标题】:How do I get the last inserted ID of a MySQL table in PHP?如何在 PHP 中获取 MySQL 表的最后插入 ID?
【发布时间】:2010-12-13 17:44:54
【问题描述】:

我有一个经常插入新数据的表。我需要获取表的最后一个 ID。我该怎么做?

SELECT MAX(id) FROM table类似吗?

【问题讨论】:

  • 是的,你这个查询将返回表的最后一个 id。但一个条件是 ID 必须是主键。这样你就可以避免悔改。
  • @sathish:该方法的主要问题是并发
  • 详细说明:问题在于,如果其他人在您的 INSERT 和查询 MAX(id) 之间的表中插入某些内容,您可能会得到一个不是 your 的 id i> 最后一个 ID。
  • @Jocelyn 这个问题是在 年之后提出的,但浏览量比这个问题少了数千。
  • @Neal,你是对的。另一个问题应该作为这个问题的副本关闭。

标签: php mysql


【解决方案1】:

我试过了

mysqli_insert_id($dbConnectionObj)

这将返回当前连接的最后插入 id,因此如果您正确管理连接,这应该可以工作。至少对我有用。

【讨论】:

【解决方案2】:

干净简单 -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];

【讨论】:

    【解决方案3】:

    使用 mysqli 因为 mysql 很贬义

    <?php
    $mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");
    
    /* check connection */
    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }
    // Conside employee table with id,name,designation
    $query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
    $mysqli->query($query);
    
    printf ("New Record has id %d.\n", $mysqli->insert_id);
    
    /* close connection */
    $mysqli->close();
    ?>
    

    【讨论】:

      【解决方案4】:

      试试这个应该可以正常工作:

      $link = mysqli_connect("localhost", "my_user", "my_password", "world");
      
      $query = "INSERT blah blah blah...";
      $result = mysqli_query($link, $query);
      
      echo mysqli_insert_id($link);
      

      【讨论】:

      • 感谢您的关注。我已经编辑了代码,实际上是$link(保持连接的变量)
      【解决方案5】:

      可以使用mysql_insert_id(), 但是有一个关于使用它的具体说明,您必须在执行 INSERT 查询后调用它,这意味着在同一个脚本会话中。 如果你使用它,否则它将无法正常工作。

      【讨论】:

        【解决方案6】:

        很遗憾没有看到任何示例的答案。

        使用 Mysqli::$insert_id:

        $sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
        $mysqli->query($sql);
        $last_inserted_id=$mysqli->insert_id; // returns last ID
        

        使用 PDO::lastInsertId:

        $sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
        $database->query($sql);
        $last_inserted_id=$database->lastInsertId(); // returns last ID
        

        【讨论】:

          【解决方案7】:

          在 codeigniter 中获取最后插入的 id 执行插入查询后,只需在数据库上使用一个名为 insert_id() 的函数,它将返回最后插入的 id

          例如:

          $this->db->insert('mytable',$data);
          echo $this->db->insert_id(); //returns last inserted id
          

          一行

          echo $this->db->insert('mytable',$data)->insert_id();
          

          【讨论】:

            【解决方案8】:

            我更喜欢使用纯 MySQL 语法来获取我想要的表的最后一个 auto_increment id。

            php mysql_insert_id() 和 mysql last_insert_id() 只给出最后一个事务 ID。

            如果您想要架构中任何表的最后一个 auto_incremented ID(不仅是最后一个事务),您可以使用此查询

            SELECT AUTO_INCREMENT FROM information_schema.TABLES
                WHERE TABLE_SCHEMA = 'my_database' 
                AND TABLE_NAME = 'my_table_name';
            

            就是这样。

            【讨论】:

            • 我对此表示怀疑,因为这个 SQL 在问题的上下文中完全是错误的......此外,当两个或多个客户端以大致相同的速度执行此 SQL 时,这种方法容易出现可能的竞争条件时间...我不确定插入后此列数据的更新速度有多快,这让我感到怀疑...。可以获取最后一个 id 的 PHP 函数基于连接/会话级别(与 MySQL 的 LAST_INSERT_ID() 或多或少相同),这使得它可以保存竞争条件
            【解决方案9】:

            如果您使用的是 PDO,请使用 PDO::lastInsertId

            如果您使用的是 Mysqli,请使用 mysqli::$insert_id

            如果你还在使用 Mysql:

            Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解prepared statements,并使用PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial

            但如果必须,请使用mysql_insert_id

            【讨论】:

            • 这个问题是如果你有很多插入发生(例如你的数据库也记录了一些东西)你可能会得到错误的ID。
            • @Mike 如果您使用 mysql_insert_id 就在您的 mysql_query 之后,则不会。当然,如果您在两者之间的同一连接上执行多个其他查询,那么在这方面没有什么可以帮助您。
            • 为了保证您永远不会得到错误的 id,请使用 TRANSACTION 包装您的代码。
            • mysql 确保这是当前连接的最后一个 id,所以如果你把这个语句放在插入查询之后不会有问题。不用担心其他进程进行插入。无需将其包装在事务中。 mysql手册说:“生成的ID在每个连接的基础上在服务器中维护。这意味着函数返回给给定客户端的值是为影响AUTO_INCREMENT列的最近语句生成的第一个AUTO_INCREMENT值那个客户。这就是你应该使用select MAX(ID)的原因
            • @deceze,我们随处可见的PDO 偏见是怎么回事?让我们再看看feature comparison。很明显,mysqli 是当你需要用低级别的东西弄脏你的手时的赢家。换句话说,即使一个人选择了 PDO,他最终无论如何都需要使用mysqli
            【解决方案10】:

            PDO:

            $pdo->lastInsertId();
            

            Mysqli:

            $mysqli->insert_id;
            

            Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解prepared statements,并使用PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial

            【解决方案11】:

            可以通过内置的php函数mysql_insert_id();获取最新插入的id

            $id = mysql_insert_id();
            

            您还可以通过

            获得最新的ID
            $id = last_insert_id();
            

            【讨论】:

            • 另外,这是错误的,因为它建议使用已弃用的库。真的,删除这个
            • @STTLCU 这里的哪个 sn-p 已弃用?
            • @TheBlackBenzKid 两者,因为它们基于 mysql_* 函数
            • @Rahul $id = last_insert_id();无法正常工作,可能已被弃用。
            【解决方案12】:

            使用MySQLi事务我有时无法获得mysqli::$insert_id,因为它返回0。特别是如果我使用存储过程,执行INSERTs。所以在事务中还有另一种方式:

            <?php
            
            function getInsertId(mysqli &$instance, $enforceQuery = false){
                if(!$enforceQuery)return $instance->insert_id;
            
                $result = $instance->query('SELECT LAST_INSERT_ID();');
            
                if($instance->errno)return false;
            
                list($buffer) = $result->fetch_row();
            
                $result->free();
            
                unset($result);
            
                return $buffer;
            }
            
            ?>
            

            【讨论】:

              【解决方案13】:

              注意:如果你用一个语句执行多个插入,mysqli::insert_id 将不正确。

              桌子:

              create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

              现在如果你这样做:

              insert into xyz (name) values('one'),('two'),('three');

              mysqli::insert_id 将是 1 而不是 3。

              要获得正确的值,请执行以下操作:

              mysqli::insert_id + mysqli::affected_rows) - 1

              这是文档,但有点晦涩。

              【讨论】:

                【解决方案14】:

                假设它们是唯一的并且自动递增的,那么您所写的内容将使您获得最大的 id 由于您使用 MySQL 作为数据库,因此有一个特定函数 LAST_INSERT_ID() 仅适用于执行插入的当前连接。
                PHP 也为此提供了一个特定的函数,称为mysql_insert_id

                【讨论】:

                  【解决方案15】:

                  有一个函数可以知道当前连接中插入的最后一个 id 是什么

                  mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
                  $id = mysql_insert_id();
                  

                  另外使用 max 是一个坏主意,因为如果您的代码在两个不同的会话中同时使用,它可能会导致问题

                  那个函数叫做mysql_insert_id

                  【讨论】:

                  • mysql_(...) 在 PHP >= 5.5 版本中已弃用。
                  • 是的,我只是想起来了。 :)
                  【解决方案16】:

                  没关系。你也可以使用LAST_INSERT_ID()

                  【讨论】:

                  • 为什么说select max(id)from table可以?
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-01-20
                  • 2017-10-14
                  • 2011-06-01
                  • 2011-09-23
                  • 1970-01-01
                  • 2017-10-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多