5

(リスト内で最も低い未使用の一意のIDを検索し、SQLテーブルで未使用の一意の値を取得することに関連してます

id列と他のいくつかを含むテーブルがあるとします(ここでは違いはありません):

+-----+-----+
| id  |other|
+-----+-----+

idの値は数値的に増加します。私の目標は、使用されていないIDを最小にして、その行を作成することです。したがって、もちろん、初めて実行すると戻り0、この行の行が作成されます。数回実行すると、次のようになります。

+-----+-----+
| id  |other|
+-----+-----+
|  0  | ... |
|  1  | ... |
|  2  | ... |
|  3  | ... |
|  4  | ... |
+-----+-----+

かなり頻繁に、これらの行の一部が削除される可能性があります。とのIDを持つ行が削除された1と仮定しましょう。3テーブルは次のようにはなりません。

+-----+-----+
| id  |other|
+-----+-----+
|  0  | ... |
|  2  | ... |
|  4  | ... |
+-----+-----+

ここでクエリを再度実行すると、IDが返され、次の1行が作成されます。

| id  |other|
+-----+-----+
|  0  | ... |
|  1  | ... |
|  2  | ... |
|  4  | ... |
+-----+-----+

次回クエリを実行すると、IDの、、などが返され3ます。56

1秒間にかなり頻繁に実行する必要があるため、これらの種類のクエリを実行するための最も効果的な方法は何ですか(IDがテーブルの唯一の目的であると想定するのが妥当です)。1つのクエリで次の未使用の行を取得することは可能ですか?または、未使用のIDを追跡する別のテーブルを導入することで、より簡単かつ迅速になりますか?

大幅に高速な場合は、すべての数値がいつか再利用されるという条件で、テーブルの任意の穴を再利用する方法を取得することもできます。

ボーナスの質問:これらのIDを保存する以外はデータベースを必要としないため、この種の情報の保存にはSQLiteを使用する予定です。この仕事を大幅に速く行うことができる他の無料の(音声のように)サーバーはありますか?

4

4 に答える 4

3

削除時にトリガーを作成し、old.idを別のテーブルに挿入すると思います。次に、そのテーブルからmin(id)を選択して、最小のIDを取得できます。

免責事項:使用しているデータベースエンジンがわからないため、トリガーを使用できるかどうかもわかりません。

于 2010-08-25T18:10:24.280 に答える
2

データベースは、値が連続しているかどうかは気にせず、値が一意であることだけを気にします。値を連続させたいという欲求idは純粋に表面的なものであり、この値をユーザーに公開する場合、それを主キーにするべきではなく、必要に応じてクライアントが形式を変更できるため、値に基づく参照整合性も必要ありません。 .

id 値の生成を処理する最も速くて安全な方法は、固有の整数値を提供するネイティブ機能 (つまり、SQLite の自動インクリメント) を利用することです。トリガーを使用するとオーバーヘッドが追加されるだけで、MAX(id) +1 を使用すると非常に危険です...

概要

理想的には、プライマリ キーにネイティブの一意の整数ジェネレーター (SQLite/MySQL auto_increment、Oracle/PostgreSQL シーケンス、SQL Server IDENTITY) を使用します。常に連続した値が必要な場合は、追加の列を追加して、その連続した値を保存し、必要に応じて維持します。MySQL/SQLite/SQL Server の一意の整数生成では、列ごとに 1 つしか許可されません。シーケンスはより柔軟です。

于 2010-08-25T18:14:02.913 に答える
2

デニス・ハーブリンクが言ったように。削除時のトリガーと挿入時のトリガー:

削除時のトリガーは、削除された ID を取得し、ID プール テーブルに挿入します (1 つの列のみid) 。

挿入前のトリガーは、id 値が提供されているかどうかを確認します。それ以外の場合は、id プール テーブルを照会し (例: SELECT MIN(id) FROM id_pool_table)、それを割り当てます (ig は id_pool_table から削除します)。

于 2010-08-25T18:14:53.933 に答える
1

通常、ID の割り当てはデータベースに任せます。ID を一意ではなくシーケンシャルにする必要がある特定の理由はありますか? 代わりに、それらにタイムスタンプを付けて、表示するときに番号を付けることができますか? または、シーケンシャル ID 用に別の列を作成し、番号を付け直しますか?

または、行自体を削除することはできませんが、列にフラグを付けて削除済みとしてマークし、マークされた行の ID を再利用して、番号が最も小さい「削除された」行を見つけ、その ID を再利用します。

于 2010-08-25T18:13:51.977 に答える