PDOはMySQLに最後に挿入されたIDをどのように知っていますか?
-
28-09-2019 - |
質問
編集: この質問のタイトルは元々: Doctrineは、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();
1つの位置のみにつながります(個別のない位置なし 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
)、サーバーはデータとその他のもので応答します OKパケット)、 含む insert_id
. 。だから私たちが発射するとき mysql_insert_id()
私たちはサーバーに接続していません。 insert_id
-MySQLライブラリはそれを行う必要はありません - それはすでにクエリの最後の実行からこの値を保存しています(少なくとも私はファイルを分析した後にそう思います libmysql.c
)
OKパケット ここで説明しています: mysqlジェネリック応答パケット-OKパケット
他のヒント
last_insert_id
のためだけに機能します AUTO_INCREMENT
列。値を手動で挿入しても機能しません AUTO_INCREMENT
桁。
教義は機能します。 NULL
それに(あなたはそれを具体的に書くことは決してありませんが)。これにより、自動増分がトリガーされ、値が提供されます last_insert_id()
.
私はあなたがそれを見ることができるようにここにJPGを含めました。それが役に立てば幸い!