• ベストアンサー

トランザクションとlast_insert_id

トランザクション中にinsertする予定のテーブル(未コミット)のauto_increment値を取得することはできるのでしょうか。 以下のような処理を期待しているのですが、hoge1テーブルのauto_increment値が取得できずに困っております。last_insert_id に関わらず、hoge1テーブルのauto_increment値が取得できる方法があれば教えてください。 (1) トランザクション開始 (2) $sql=" INSERT INTO hoge1(name) value('あああ'); "; (3) ( ロールバック ) (4) $key=mysql_insert_id(); (5) $sql2=" INSERT INTO hoge2(hoge1_primary,age) value($key,'20歳'); "; (6) ( ロールバック ) (7) コミット (8) トランザクション終了 よろしくお願いします。 環境: php5,mysql5 (InnoDB)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

トランザクション中のINSERTに対しても、LAST_INSERT_ID()関数は適切な値を返すと思いますが、状況としては、『取得できない』とは、エラーがでるのでしょうか?それとも、不適切な(予期しない)値が得られるのでしょうか? 状況をもう少し教えていただけると助かります。 (直にSQLで『SELECT LAST_INSERT_ID();』を実行して、ダメでしょうか?)

mgop9
質問者

お礼

すみません、SELECT LAST_INSERT_ID(); で取得できました。 以前、試した時は 0 しか返ってこなかったのですが、今一度試してみたら取得できました。以前は書き方が間違っていたようです。 おさわがせしてすみません、ありがとうございました。

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

質問の意図が分かりません。 >(ロールバック) とありますが、これはどんな意味ですか? それで最終的にはどんな結果を求められているのか、それに対して現在の 状況はどうなのか。 説明しないと誰も分からないと思いますよ。

mgop9
質問者

補足

言葉たらずで失礼いたしました。 hoge1テーブル: name (char) hoge1_primary (int,primary ,auto_increment) hoge2テーブル:  hoge1_primary (int) age (char) hoge1テーブルのauto_increment値をhoge2テーブルに引き渡したいと考えています。以下のサンプルだと、$keyに0が格納されてしまう状況にあり、困っています。 ( ロールバック ) は、トランザクションが途中で失敗した場合における $db->rollback(); です。わかりずらくてすみませんでした。 include("DB.php"); $db = DB::connect( 省略 ); $db->autoCommit( FALSE ); $sql=" INSERT INTO hoge1(name) value('あああ'); "; $result=$db->query( $sql ); if( DB::isError( $result ) ){   $db->rollback(); $flg=true; } $key=mysql_insert_id(); $sql2=" INSERT INTO hoge2(hoge1_primary,age) value($key,'20歳'); "; $result2=$db->query( $sql2 ); if( DB::isError( $result2 ) ){   $db->rollback(); $flg=true; } if($flg!=true){ $db->commit(); } $db->disconnect();

関連するQ&A