テーブルにデータ入れる時、「既存データの最大値+1」を使いたいことはよくある。
けど諸般の事情で auto_increment
は使いたくない、ということも、ままある。(ないですか?)
その時の定番フレーズを良く忘れるのでメモ。
INSERT INTO テーブル名 ( id, name, とかなんとか )
SELECT last_insert_id( ifnull(max(id), 0) + 1 ), '何かデータ', とかなんとか
FROM テーブル名
既存データが1件も無い場合は、max()
は null
を返すので、ifnull()
で 0 扱いしてる。
いま追加した id の取得は以下の通り。
SELECT last_insert_id() FROM テーブル名
last_insert_id()、便利かも
auto_increment
された値をもらう関数だと思ってた。
マニュアルよく読んでみたら、もちろんその用途にも使えるけど、それだけじゃなかった。
- 引数あり
last_insert_id(何かしら)
で、何かしらが保存され、その場では何かしらをそのまんま返す関数。 - 引数なしの
last_insert_id()
で、直近に保存された値が受け取れる。 - 他のステートメント発行しても、
last_insert_id(何かしら)
を使わない限り、値は変わらない。 - 接続ごとにサーバに保存される。別の接続で同時にほかの人が触っていても、値は変わらない。