私は列IDと1000個のアイテムのようなものを持っていますが、そのうちのいくつかは次のように削除されましたid=90, id=127, id=326
これらの使用可能な ID を検索するクエリを作成して、別のアイテムに再利用できるようにするにはどうすればよいですか?
のようなものmin(ID)
ですが、データベースにない ID のみを検索したいので、 の項目を削除するとID = 90
、次に ADD ITEM をクリックしたときに次のように挿入しますid = 90
このクエリを使用して、使用可能な最小IDを取得できます。
SELECT MIN(t1.ID + 1) AS nextID
FROM tablename t1
LEFT JOIN tablename t2
ON t1.ID + 1 = t2.ID
WHERE t2.ID IS NULL
それは、テーブルをそれ自体と結合し、min+1
IDがそうであるかどうかをチェックするnull
ことです。nullの場合、そのIDが使用可能です。
次 のようなテーブルがあるとID
し
ます
。125
6
次に、このクエリはあなたが望むものとしてあなたに結果を与えるでしょ3
う。
IDを再利用しないでください。通常、十分な数のIDを使用できるため、断片化を気にする必要はありません。
たとえば、IDを再利用する場合、検索エンジンからのリンクは、検索インデックスにあるものとはまったく関係のないものを指している可能性があります。このような場合、「見つかりません」エラーを表示する方がはるかに優れています。
ID を再利用しようとするのは代理キーの概念に反する
代理キーは、実際のオブジェクトではなく、レコード自体を識別するため、優れています。レコードがなくなると、ID もなくなります。
経験豊富な DB 開発者は、長い整数の数を使い果たすのに何世紀かかるかを知っているため、数が不足することを恐れません。
ところで、同時トランザクションが ID シーケンスのギャップを見つけようとするマルチスレッド環境で、ロックまたは一意性の問題に違反する可能性があります。DB サーバーによって提供される自動インクリメント ID ジェネレーターは、通常、トランザクションの範囲外で動作するため、適切な代理キーを生成します。
さらに読む:代理キー
クエリは次のようなものです:
SELECT MIN(tableFoo.uniqueid + 1) AS nextID
FROM tableFoo
LEFT JOIN tableFoo tf1
ON tableFoo.uniqueid + 1 = tf1.uniqueid
WHERE tf1.uniqueid IS NULL