検索したら「LAST_INSERT_IDを使う」っとあったのですが、INSERTしてデータを追加した後でないと、取得できないようです。
私の認識不足やSQLの書き方が悪いのかも知れませんが、もしINSERTしなくても最新のオークインクリメントの番号を、取得できる方法がありましたら、教えていただければと思います。
※MySQLは4.0系でお願いします。
Oracleさんはシーケンス使えるので問題ないのですと
いうことでOracleのこの機能をMysqで使うのには
どうすればいいかを検索かけました。
実装方法はこんな感じのようです。
http://www.art-code.org/2006/06/auto_increment.html
>INSERTしなくても最新のオークインクリメントの番号を、
>取得できる方法
INSERTしなくても、INSERTした後のオークインクルメント番号
を知りたいという意味だと思うんですが・・。
ちょっと私にはわかりませんね。
それ以前に、知らなくても実装する方法はないんでしょうか?
う~ん、URL先でも上手くいかないですね。そっくり同じにしてみたのですが。
>>INSERTしなくても、INSERTした後のオークインクルメント番号
>>を知りたいという意味だと思うんですが・・。
ここでいう「意味」とは、私の本質問の意図の事ですか?
オートインクリメントの番号をINSERTせずに知りたいというのは、WEBコンテンツのフォーム登録確認時に表示したいからです。
例えば、「この投稿には○番のIDが付与されます。よろしいですか?」と言うような、フォーム登録の確認で、使用したいのです。
通常、オートインクリメントを与えたフィールド(例えばid)は、登録があると自動的に番号が付加されますが、データを削除されても順番に番号が付いていきます。(idが100,101,102とデータがある場合、102を削除したら次は103になる)
だから、既存の最新データのidを取得し、+1して「登録番号」としても、実際に登録される番号が違う可能性があります。
なので、登録する前に実際に付加されるオートインクリメントの数値を知りたいと思いました。
最後にINSERTしたidは
SELECT LAST_INSERT_ID( ) ;
で得る事ができます。でもデータベースにアクセスする人が複数いる場合は、自分が次に使うidが今表示させたid+1になるとは限らないですよ。INSERTしなければ次のidは確定できないと考えた方が良さそうです。
想像してみてください。
A君が書き込んで確認画面が出た (A君には101という番号が返された。) ↓ B君が書き込んで確認画面が出た (B君には102という番号が返された。) ↓ B君のほうが先に確認済みボタンをクリックした。 (オートインクリメントなので101で登録された)
といったような具合になるとダメですよね。
では、
A君が書き込んで確認画面が出た (A君には101という番号が返された。) ↓ B君が書き込んだら他の人が作業中と言う事で待たされた。 ↓ B君は何度も書き込みボタンをクリックするが「他の人が作業中」と言う事で待たされた。 ↓ A君が確認済みボタンをクリックした。 (オートインクリメントなので1で登録された) ↓ B君は何度もクリックを続けていたが、やっとの事で確認画面が返ってきた。 (B君には102という番号が返された。)
というように作業中はデータベースをロック(独占)すれば良いのだが、
上記のようにB君はいつ接続できるともしれないデータベースに何度も挑戦するような形になり
タイミングが悪ければ後から接続を試みたC君やD君に先を越されて
B君はいつまでも待たされる可能性がでてくる・・・。
上記のようにロックしてしまえば番号はズレたりしませんが
あまり賢い処理方法とは言えないですよね。
で、結局のところ、一旦仮に書き込んでしまうといった手順が必要になってくると言う事になります。
レコードに仮登録中フラグを立てておいて、確認が取れた時点でフラグを消去。
定期的に規定の時間を過ぎてもフラグが立ったままのレコードは強制削除。
仮登録日時と確認日時の2つを持たせるという手でも良いでしょう。
phpMyAdminで表示されているauto_incrementの値については
phpMyAdminでauto_incrementの値を表示している最中に
新しいレコードを書き込むSQLを平行して実行し、書き込めたかどうか、
そして、その後でauto_incrementの値はどうなっているのかを確認してみてください。
書き込めなかったとすればロックされている。
書き込めたとすればphpMyAdminでの表示はその時点だけのものだった。
という違いが理解できる事でしょう。
詳しくありがとうございます。
確認する=>レコードを登録する=>正式に登録する場合はUPDATE
と言うのは理屈として理解できますし、おそらくこの方法しかないのかも知れません。
しかし、フラグ処理や「一定時間~」に関する処理を入れると、それだけ余計な処理も増えるので、それが問題ですね。
次のAUTO_INCREMENT値(id)をテーブル(hoge)から取得する。
SELECT IFNULL(MAX(id)+1,1) AS next_id FROM hoge ;
参照したURL。
http://dev.mysql.com/doc/refman/4.1/ja/control-flow-functions.ht...
登録数によってID番号が決まるようで、レコードを削除したらnext_idの値も減るので、これは利用できないと思います。
URLだけ出されても・・・