質問: 連番欠番アルゴリズム accessのmdbです。 u b i a d n --- 1 4 2 1 3 3 4 6 uidは主キーです。 banはユニークにしたいフィールドです。 banが3であるレコードをインサートする前に、banのユニークを保つため uid==1とuid==3のレコードのbanをインクリメントしたいです。 以下のようになればよいのですが、プロシージャ無しで軽く実行できないでしょうか? u b i a d n --- 1 5 2 1 3 4 4 6 5 3
回答: 目的の更新を掛けるだけなら以下のクエリで可能と思います。 update tbl1 set ban = ban+1 where ban between 3 and (select min(ban) from tbl1 where ban not in (select ban-1 from tbl1) and ban>=3); スタンドアロンで使用しているなら、特に問題はないでしょうが、 このupdateを掛けてからinsertを行うまでには、該当レコードすべてをロックしなければ更新の競合により整合性が維持できなくなるリスクが高まりますし、レコードを追加すればするほど更新対象件数も増えていきます。逆にロックを掛けるとupdate自体が失敗する可能性も高くなります。 データ構造自体は考え直した方がいいかもしれません。