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


たけのこ  2003-10-23 00:42:17  No: 109330

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

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

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


ファン太  2003-10-24 18:51:30  No: 109331

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


red-fish  2003-10-24 20:26:54  No: 109332

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


red-fish  2003-10-24 23:18:04  No: 109333

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

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


red-fish  2003-10-24 23:41:07  No: 109334

これでどうだろう?

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)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加