14

編集:この質問のタイトルは元々次のとおりでした:DoctrineはMySQLに最後に挿入されたIDをどのように知っていますか?DoctrineORMマッパーに関連していました。少し掘り下げてみると、この質問は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();

ログ内の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であることをどのようにして知りましたか?ログには他に何もありません。

4

3 に答える 3

23

私はいくつかの調査を行い、いくつかのソースコードを閲覧したので、私の答えは少し間違っていて正確ではない可能性があります。

まず第一に、これは実際にはDoctrineとは関係ありません。DoctrinePDO_MYSQLを使用します。ただし、内部的には、 PDO_MYSQLは関数と同じものmysql_insert_id(ネイティブMySQL C API関数)を使用しますmysql_insert_id

個別に存在しない理由はSELECT LAST_INSERT_ID()、ステートメントが実行された後(私の例では)、サーバーがデータおよびOKパケットに含まれる他のいくつかのもの(を含む)でINSERT応答するという事実にあります。したがって、サーバーに接続していないときに起動すると、受信するために-mysqlライブラリはそれを行う必要はありません-クエリの最後の実行からすでにこの値が保存されています(少なくともファイルを分析した後はそう思います)insert_idmysql_insert_id()insert_idlibmysql.c

OKパケットの説明:MySQL Generic Response Packets-OK Packet

于 2010-11-24T20:39:31.597 に答える
1

おそらくhttp://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.htmlを呼び出すことによって

于 2010-11-24T13:53:39.137 に答える
1

last_insert_id列に対してのみ機能しAUTO_INCREMENTます。AUTO_INCREMENT列に手動で値を挿入すると機能しません。

教義は、それに割り当てるのと同じであるため、機能NULLします(ただし、具体的にそれを書くことはありません)。これにより、自動インクリメントがトリガーされ、の値が提供されlast_insert_id()ます。

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

ここに画像の説明を入力してください

于 2010-11-24T18:26:00.290 に答える