次のテーブルがあるとします。
id name base index
0 A 2 0
1 B 2 2
2 C 2 4
3 D 2 6
4 E 2 8
5 F 2 10
つまり、index = base * i で、i はシーケンス内のその行の位置です。
たとえば、C と D という名前の行を削除すると、いくつかの行が削除されることがあります。
id name base index
0 A 2 0
1 B 2 2
4 E 2 8
5 F 2 10
新しい行は常に最後の行の後に追加されるため、この場合、次の行は MAX(index)+base=12 になりますが、削除された行のためにインデックス列の値の間に残ったギャップは、しばらくすると問題になります。最後に挿入する代わりに、最初に利用可能なギャップに挿入すると、問題は発生しません。
したがって、最初に利用可能なギャップを見つけるためのクエリが MAX(index) と同じくらい効率的であるとは思えませんが、最も効率的なソリューションは何でしょうか? 多分それで十分です。
明確でない場合は、最も近い上位インデックス値を持つ行が a.index + a.base より大きくなるように、最初の行 'a' を見つける必要があります。
これは、任意の SQL データベースに ORM を使用するアプリケーションを対象としているため、厳密に標準 SQL である必要があります。
編集
これは、実際のテーブルと実際の問題を簡略化したものであり、ベース カラムとインデックス カラムのみを使用したソリューションを探しています。新しい列を追加したり、他のテーブルにインデックスを作成したりするソリューションは、私のアプリケーションでは実用的ではありません。
編集 2
ベース列が複雑になっているようですが、それは必須ではありません。問題は、次のような表に縮小できます。
id name index
0 A 0
1 B 1
4 E 4
5 F 5
最初の行 'a' を見つけて、a.index + x よりも高い最低インデックスを持つ行を見つける必要がある場所。この場合、x = 1 です。
最初に順序付けせずに列挙したり、id を利用したりすることは、変更される可能性があるため、信頼できるソリューションではありません。たとえば、行も次のようになっている場合、解決策が機能する必要があります。
id name index
0 A 0
23 F 5
45 E 4
90 B 1