PDO如何知道MySQL中最后插入的id?
-
28-09-2019 - |
题
编辑: 这个问题的标题原来是: Doctrine如何知道MySQL中最后插入的id? 并与 教义 ORM 映射器。经过一番挖掘后,我发现这个问题与 教义 但为了 PDO_MySQL, MySQL C API 最后 - MySQL 客户端-服务器通信。我决定更改标题,这样也许有人会找到他/她的问题的答案。
对于那些不使用 Dotrine 的人:我很好奇,为什么吼叫:
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?日志中没有其他内容。
解决方案
我做了一些研究并浏览了一些源代码,所以我的答案可能有点错误并且不准确。
首先,这实际上与 教义. 教义 用途 PDO_MYSQL. 。但在内部 PDO_MYSQL 使用相同的东西 mysql_insert_id
功能 - 本机 MySQL C API 功能 - mysql_insert_id
.
没有单独的原因 SELECT LAST_INSERT_ID()
事实上,在执行该语句之后(在我的示例中 INSERT
),服务器响应数据以及其中包含的一些其他内容 确定包), 包括 insert_id
. 。所以当我们开火时 mysql_insert_id()
我们没有连接到服务器来接收 insert_id
- mysql 库不需要这样做 - 它已经存储了上次执行查询时存储的值(至少在分析文件后我是这么认为的) libmysql.c
)
确定包 描述如下: MySQL 通用响应数据包 - OK 数据包
其他提示
last_insert_id
仅适用于AUTO_INCREMENT
列。如果你手动插入一个值到AUTO_INCREMENT
列它不会工作。
该学说会工作,因为它就像分配NULL
吧(虽然你从来没有明确写)。这触发了自动递增,并提供last_insert_id()
的值。
我已经包含了一个jpg使这里你可以看到它。希望它可以帮助!