代码之家  ›  专栏  ›  技术社区  ›  prostynick

PDO如何知道MySQL中最后插入的ID?

  •  14
  • prostynick  · 技术社区  · 14 年前

    编辑: 这个问题的标题最初是: 条令如何知道MySQL中最后插入的ID? 教条 ORM映射器。经过一番挖掘,我发现这个问题与 教条 但要 PDO-MySQL , MySQL C API 最后-到MySQL客户机-服务器通信。我已决定更改标题,所以也许有人会找到他/她的问题的答案。

    对于那些不使用教义的人:我很好奇,为什么要这样说:

    mysql_query("INSERT INTO category (name) VALUES('cat')");
    echo mysql_insert_id();
    

    或类似:

    $pdo->exec("INSERT INTO category (name) VALUES('cat')");
    echo $pdo->lastInsertId();
    

    只会导致一个位置(没有单独的 SELECT LAST_INSERT_ID() )在日志中:

    1701 Query    INSERT INTO category (name) VALUES ('cat')
    

    原始问题:

    我有两张桌子:

    category(id,name)
    product(id, name, categoryId)
    

    我创建了新的类别对象和产品对象。我将类别对象分配给产品对象。我没有设置任何ID:

    $product = new Product();
    $product->name = 'asdf';
    
    $category = new Category();
    $category->name = 'cat';
    
    $product->Category = $category;
    

    之后我刷新了连接并检查了mysql日志:

    1684 Query  START TRANSACTION
    1684 Query  INSERT INTO category (name) VALUES ('cat')
    1684 Query  INSERT INTO product (name, categoryid) VALUES ('asdf', '312')
    1684 Query  COMMIT
    

    条令怎么知道,新创建的类别ID是312?日志中没有其他内容。

    3 回复  |  直到 11 年前
        1
  •  23
  •   jensgram    11 年前

    我做了一些研究,浏览了一些源代码,所以我的答案可能有点错误,而且不精确。

    首先,这与 教条 . 教条 使用 PDO-MySQL . 但在内部 PDO-MySQL 使用与 mysql_insert_id 函数-本机 MySQL C API 功能- mysql_插入\u id .

    为什么没有分离的原因 SELECT LAST_INSERT_ID() 事实上,在语句执行之后(在我的示例中 INSERT )中包含的数据和其他一些内容 确定数据包 )包括 insert_id . 所以当我们开火的时候 mysql_insert_id() 我们没有连接到服务器,无法接收 插入\u id -MySQL库不需要这样做-它已经存储了上次执行查询时的这个值(至少在分析了文件之后我认为是这样 libmysql.c )

    确定数据包 如下所述: MySQL Generic Response Packets - OK Packet

        2
  •  1
  •   Tobias    14 年前
        3
  •  1
  •   aksu    11 年前

    last_insert_id works only for auto_increment columns.如果将值手动插入 auto_increment column,它将不起作用。

    这条原则会起作用,因为它就像给它分配一个 null 这将触发自动增量并为 last_insert_id()提供一个值。

    我在这里加了一张JPG以便你能看到。希望有帮助!

    NS。如果将值手动插入到 自动增量 列。

    这条原则会起作用,因为它就像分配一个 NULL 给它(尽管你从来没有特别写过)。这将触发自动增量并为 last_insert_id() .

    我在这里加了一张JPG以便你能看到。希望有帮助!

    enter image description here