php - 返り - PDOはMySQLに最後に挿入されたIDをどのように認識しますか?




php pdo insert 返り 値 (2)

last_insert_idは、 AUTO_INCREMENTカラムに対してのみ機能します。 AUTO_INCREMENTカラムに手動で値を挿入した場合は機能しません。

その教義はそれにNULLを代入することに似ているのでうまくいくでしょう(あなたが特にそれを書くことは決してありませんが)。 これにより自動増分がトリガーされ、 last_insert_id()値が提供されます。

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

編集:この質問の題名はもともと: DoctrineはMySQLに最後に挿入されたIDをどのようにして知るのですか? そしてDoctrine ORMマッパーに関連していました。 いくつか調べたところ 、この質問は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()別々の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であることをどのように知りましたか? ログには他に何もありません。





communication-protocol