- ベストアンサー
LAST_INSERT_IDで同時にアクセスが会った時
MYSQL 3.23 auto_incermentで発行されたIDを別テーブルに使いたいのです。 last_insert_id や mysql_insert_id はコネクションごとに区別されるというのは本当でしょうか? 同時に複数のinsertが実行された場合でも、同じコネクションで発行されたIDだけを取得可能でしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「多くの場合、ユーザは、複数のテーブルの 一意の識別子を管理するために ROLLBACK や LOCK TABLES を使用していた。これは、 AUTO_INCREMENT カラムおよび SQL 関数 LAST_INSERT_ID() または C API 関数 mysql_insert_id() を使用することで、 はるかに効率的に処理することができる。」 とありますので、一応は保証されていると考えて よいのではないでしょうか。もちろん私が、保証 することはできませんので、自己責任で判断すべき ことです。 3.23はトランザクション環境にないため、厳密に 整合性を保つためにはid管理は使用者側が任意に 行うべきだというのが個人的な感想です。 お役にたてませんで、申し訳ないです
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
もうすこし具体的にお願いします。 last_insert_id()は確かに最終発行された auto_incrementの値を返す様ですが、セッション が切れると参照ができないようです。 (所定の措置を入れれば別?) 試した感じ、そのセッションのinsertされたIDが 返されているようなので特に問題ないかとは 思いますが、実際にそれが信用できるかどうかは 微妙です。 select文を発行してidを得る方が間違いないかと 思いますがいかがでしょうか?
補足
回答ありがとうございます。 auto_incrementを使用しているテーブルには、他にユニークなデータを持つカラムがありません。order by 句はやろうとしている事から、使用不可能です。 やろうとしていることとしては、 テーブルAには auto_incrementのIDとその他データ テーブルBには テーブルAに挿入されたデータと関連したその他データ つまり、テーブルBのレコードは、テーブルAに挿入してできたauto_incrementのIDのあるレコードと関連した情報を持つ予定です。 この二つのテーブルを関連づけるものとして、auto_incrementで発行されたIDを使用したいと思っています。 (プログラムとしてはapacheモジュールのPHPを使用しています。) そこで、 同時に始めのinsertが実行されてしまった場合、last_insert_idで それぞれのinsertで発行されたIDを取得できるのかどうか疑問でした。 よろしくお願いします。
補足
大変助かります。 ありがとうございます。 最終的な手段としては、auto_incrementのIDを生成するためだけのテーブルを作成して、 テーブルA、テーブルBと共にPRIMARYをセットしておけば、 データの整合性が保たれるのではないかと考えていました。 引き続き、もう少し自分でも調べてみようと思います。 ご回答本当にありがとうございます。