VBでDAOを使ってデータベースにアクセスしているのですが、
ユニークなIDの取得方法が
ID Field1
1 a
2 b
3 c
5 d
6 e
というテーブルがあったとき、次のIDは"7"ではなく、
"4"を取得したいのですが、方法がありますでしょうか?
つまりIDは、数値をどんどん増やすのではなく、削除などで
飛び飛びになってしまった所を埋めていく形にしたいのです。
どういう理由でそういった機能が必要なのか?ですけど、ワタシそういう変わった(失礼)人キライじゃないですよ (^^;
DAOのAutoIDでは無理ですね
同一のDBにID管理用のテーブルを作ってみては?。(インクリメント用、削除済みIDの保存用)
新しいレコードを追加するとき
削除済みIDにレコードが残っていれば(IDでインデックスしておく)それを使い(使ったら削除)、
レコードがひとつも無ければインクリメントからIDを得る。
レコードが削除されたらそのキーを削除用レコードに追加・・ってな感じ。
都度の計算量は増えるけど、
MaxとCountを比較して、同じなら新規採番。
違うなら、MaxとCountをもとに2分探索していき、もっとも若い欠番を調べる。
というのもいけるかなぁ。
遅くていいなら
select ID + 1
from TBL
where ID + 1 not in (select ID from TBL);
のSQL一回で取れるか...
このSQLを最も効率よく書いたらどうなるんだろう?
これでどうだろう?
select top 1 nextID from (
select a.ID, b.nextID FROM TBL as a right outer join
(select ID + 1 as nextID from TBL) as b on a.ID = b.nextID)
where isnull(ID)
ツイート | ![]() |