質問

編集: この質問のタイトルは元々: 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パケット

他のヒント

おそらく電話することによって http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

last_insert_id のためだけに機能します AUTO_INCREMENT 列。値を手動で挿入しても機能しません AUTO_INCREMENT 桁。

教義は機能します。 NULL それに(あなたはそれを具体的に書くことは決してありませんが)。これにより、自動増分がトリガーされ、値が提供されます last_insert_id().

私はあなたがそれを見ることができるようにここにJPGを含めました。それが役に立てば幸い!

enter image description here

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top