自動採番を穴埋め形式で行うには?

解決


H.E.  2006-12-14 20:57:03  No: 97407

開発環境  VB6.0  XP  SQLServer2000

PKとなるIDを自動で採番したいのですが、
例えば、IDが1,2,3,4,6,7,8・・・と存在した場合、
5というIDを自動で取得する処理を考えています。
(削除処理が物理削除のため)
1,2,3,4,5,6,7,8・・・とあった場合は、連番で9というIDを取得したいです。

今まで論理削除だったため、MAX値に1を足していただけだったのですが、
仕様が変わったため、アドバイスを頂きたいと考えています。

宜しくお願いします。


魔界の仮面弁士  2006-12-14 21:46:53  No: 97408

> 削除処理が物理削除のため

「物理削除」する際に、その削除した ID をトリガー等で蓄えておき、
その中の最小番号を返すようにし、蓄えられたIDが無いときは、
今までどおり、MAX(ID)+1 を返すようなストアドを作っておくとか。

あるいは、
  SELECT rank=COUNT(*), T1.ID
  FROM Table1 T1, Table1 T2
  WHERE T1.ID >= T2.ID
  GROUP BY T1.ID
  ORDER BY 1
などとして、行番号の連番を作成し、それを #table (一時表) に入れ、
連番値と行番号が異なる値の最小値を見つけるようにするとか。


もげ  2006-12-14 21:50:52  No: 97409

空き番管理テーブルを用意して、削除時にトリガ等で自動追加して利用するとか、
ID管理テーブルで(8桁なら1000万件必要ですが)
「この番号使ってないよフラグ」のON/OFFで管理するとか。
(どちらも当方の知る案件に実在しますが、
そもそもPKに連番の意味をもたせる必要は無いし(一意であればいい)、
IDでソートしたときに時系列で並ばないとかパフォーマンスとか
弊害のほうが大きい気もしますね)


H.E.  2006-12-14 22:55:35  No: 97410

魔界の仮面弁士 様  、  もげ 様

早々の意見をありがとうございます。
アドバイス通り、削除時の処理を変更し、トリガを利用しました。

どうにか理想とする動きになりました。

ほんとに助かりました。お礼を申し上げます。


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

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






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