gpt4 book ai didi

php - PDO 如何知道 MySQL 中最后插入的 id?

转载 作者:IT老高 更新时间:2023-10-29 00:06:36 31 4
gpt4 key购买 nike

编辑: 这个问题的标题最初是:Doctrine 如何知道 MySQL 中最后插入的 id? 并且与 Doctrine ORM 映射器相关。经过一些挖掘后,我发现这个问题与Doctrine 无关,而是与PDO_MySQLMySQL C API 以及最后 - 与 MySQL 客户端服务器相关沟通。我决定更改标题,这样也许有人会找到他/她的问题的答案。

对于那些没有使用 Doctrine 的人:我很好奇,为什么会这样:

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')

原始问题:

我有 2 个表:

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

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

最佳答案

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

首先,这与Doctrine 没有真正的关系。 Doctrine 使用 PDO_MYSQL。但在内部 PDO_MYSQL 使用与 mysql_insert_id 函数相同的东西 - 原生 MySQL C API 函数 - mysql_insert_id

没有单独的 SELECT LAST_INSERT_ID() 的原因在于,在语句执行后(在我的示例中 INSERT),服务器响应数据以及 OK 数据包 中包含的一些其他内容),包括 insert_id。所以当我们触发 mysql_insert_id() 时,我们并没有连接到服务器,接收 insert_id - mysql 库不需要这样做 - 它已经从上次存储了这个值执行查询(至少我在分析文件 libmysql.c 之后是这样认为的)

OK Packet 描述如下:MySQL Generic Response Packets - OK Packet

关于php - PDO 如何知道 MySQL 中最后插入的 id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4267470/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com