编辑: 这个问题的标题原来是: 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使这里你可以看到它。希望它可以帮助!

“在这里输入的图像描述”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top