開発環境 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を足していただけだったのですが、
仕様が変わったため、アドバイスを頂きたいと考えています。
宜しくお願いします。
> 削除処理が物理削除のため
「物理削除」する際に、その削除した 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 (一時表) に入れ、
連番値と行番号が異なる値の最小値を見つけるようにするとか。
空き番管理テーブルを用意して、削除時にトリガ等で自動追加して利用するとか、
ID管理テーブルで(8桁なら1000万件必要ですが)
「この番号使ってないよフラグ」のON/OFFで管理するとか。
(どちらも当方の知る案件に実在しますが、
そもそもPKに連番の意味をもたせる必要は無いし(一意であればいい)、
IDでソートしたときに時系列で並ばないとかパフォーマンスとか
弊害のほうが大きい気もしますね)
魔界の仮面弁士 様 、 もげ 様
早々の意見をありがとうございます。
アドバイス通り、削除時の処理を変更し、トリガを利用しました。
どうにか理想とする動きになりました。
ほんとに助かりました。お礼を申し上げます。
ツイート | ![]() |