ユニークなIDを取得するには?


たけのこ  2003-10-22 15:42:17  No: 109330  IP: [192.*.*.*]

VBでDAOを使ってデータベースにアクセスしているのですが、
ユニークなIDの取得方法が

ID  Field1
1     a
2     b
3     c
5     d
6     e

というテーブルがあったとき、次のIDは"7"ではなく、
"4"を取得したいのですが、方法がありますでしょうか?
つまりIDは、数値をどんどん増やすのではなく、削除などで
飛び飛びになってしまった所を埋めていく形にしたいのです。

編集 削除
ファン太  2003-10-24 09:51:30  No: 109331  IP: [192.*.*.*]

どういう理由でそういった機能が必要なのか?ですけど、ワタシそういう変わった(失礼)人キライじゃないですよ  (^^;
DAOのAutoIDでは無理ですね
同一のDBにID管理用のテーブルを作ってみては?。(インクリメント用、削除済みIDの保存用)
新しいレコードを追加するとき
削除済みIDにレコードが残っていれば(IDでインデックスしておく)それを使い(使ったら削除)、
レコードがひとつも無ければインクリメントからIDを得る。
レコードが削除されたらそのキーを削除用レコードに追加・・ってな感じ。

編集 削除
red-fish  2003-10-24 11:26:54  No: 109332  IP: [192.*.*.*]

都度の計算量は増えるけど、
MaxとCountを比較して、同じなら新規採番。
違うなら、MaxとCountをもとに2分探索していき、もっとも若い欠番を調べる。
というのもいけるかなぁ。

編集 削除
red-fish  2003-10-24 14:18:04  No: 109333  IP: [192.*.*.*]

遅くていいなら
select ID + 1 
from TBL
where ID + 1 not in (select ID from TBL);
のSQL一回で取れるか...

このSQLを最も効率よく書いたらどうなるんだろう?

編集 削除
red-fish  2003-10-24 14:41:07  No: 109334  IP: [192.*.*.*]

これでどうだろう?

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)

編集 削除