• ベストアンサー

ユニークIDを連番にする

DB(Mysql)にあるIDを以下の条件をもとに一意に振りたいと考えております。 ・ID:0,1,2のみが(DBに)あれば次はID3を振る ・ID:0,2,3のみが(DBに)あれば次はID1を振る ご存じの方、宜しくお願いします。

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

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

ID + 1がIDに存在しない最小値,という考え方をすればできるようです。 ref) HAVING句の力 (1/2):CodeZine http://codezine.jp/article/detail/652?p=1

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

まぁふつうの運用では以下のような感じなんですけどね ・データの削除をせず、フラグで管理する ・仮にデータを削除する場合はauto incrementなどでつけるような連番は  そもそも抜け番号など気にしない ・それでもどうしても連番で表示したいなら、変数でインクリメント処理するとか  ランク処理をいれる SET @renban=0; select *,(@renban:=@renban+1) as renba from テーブル; みたいな感じ(ランク処理はここで例示するにはめんどうなので割愛)

  • STICKY2006
  • ベストアンサー率29% (1536/5269)
回答No.2

効率もクソも考えなくてやるとしたら >>・ID:0,1,2のみが(DBに)あれば次はID3を振る >>・ID:0,2,3のみが(DBに)あれば次はID1を振る IDの最大値と、レコード数を取得し、 IDの最大値+1=レコード数 だったら欠番なし。 IDの最大値+1>レコード数 だったら欠番ありだから、補間処理。 補間処理は、ID全部取得しておいて、 0から+1ずつ増やした値と取得しておいたID比較して、 合致しなかった時点でbreakかまして、そこの値を使ってIDを振る。 まぁ、後は、欠番が出る=どっかで削除処理する。 わけだから、削除処理を行った際に、欠番管理テーブルにでも欠番を突っ込んでおいて、 それを取得してくる。ぐらいがパッと思いつくところ。 でも、それだと処理追加箇所が多いし、DBアクセス回数自体は変わらないから 自分なら前者かな。。。 まぁ、IDのチェックするテーブルが、10万レコード、100万レコード。 とかになるものだったら考えちゃうけど-w-

関連するQ&A