dポイントプレゼントキャンペーン実施中!

DB(Mysql)にあるIDを以下の条件をもとに一意に振りたいと考えております。

・ID:0,1,2のみが(DBに)あれば次はID3を振る
・ID:0,2,3のみが(DBに)あれば次はID1を振る

ご存じの方、宜しくお願いします。

A 回答 (3件)

ID + 1がIDに存在しない最小値,という考え方をすればできるようです。



ref) HAVING句の力 (1/2):CodeZine
http://codezine.jp/article/detail/652?p=1
    • good
    • 0

まぁふつうの運用では以下のような感じなんですけどね



・データの削除をせず、フラグで管理する
・仮にデータを削除する場合はauto incrementなどでつけるような連番は
 そもそも抜け番号など気にしない
・それでもどうしても連番で表示したいなら、変数でインクリメント処理するとか
 ランク処理をいれる

SET @renban=0;
select *,(@renban:=@renban+1) as renba from テーブル;

みたいな感じ(ランク処理はここで例示するにはめんどうなので割愛)
    • good
    • 0

効率もクソも考えなくてやるとしたら



>>・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-
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!