29

私は列IDと1000個のアイテムのようなものを持っていますが、そのうちのいくつかは次のように削除されましたid=90, id=127, id=326

これらの使用可能な ID を検索するクエリを作成して、別のアイテムに再利用できるようにするにはどうすればよいですか?

のようなものmin(ID)ですが、データベースにない ID のみを検索したいので、 の項目を削除するとID = 90、次に ADD ITEM をクリックしたときに次のように挿入しますid = 90

4

7 に答える 7

43

このクエリを使用して、使用可能な最小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+1IDがそうであるかどうかをチェックするnullことです。nullの場合、そのIDが使用可能です。 次 のようなテーブルがあるとIDし ます 。125
6


次に、このクエリはあなたが望むものとしてあなたに結果を与えるでしょ3う。

于 2011-02-16T13:23:57.120 に答える
5

IDを再利用しないでください。通常、十分な数のIDを使用できるため、断片化を気にする必要はありません。

たとえば、IDを再利用する場合、検索エンジンからのリンクは、検索インデックスにあるものとはまったく関係のないものを指している可能性があります。このような場合、「見つかりません」エラーを表示する方がはるかに優れています。

于 2011-02-16T13:23:50.980 に答える
4

ID を再利用しようとするのは代理キーの概念に反する

代理キーは、実際のオブジェクトではなく、レコード自体を識別するため、優れています。レコードがなくなると、ID もなくなります。

経験豊富な DB 開発者は、長い整数の数を使い果たすのに何世紀かかるかを知っているため、数が不足することを恐れません。

ところで、同時トランザクションが ID シーケンスのギャップを見つけようとするマルチスレッド環境で、ロックまたは一意性の問題に違反する可能性があります。DB サーバーによって提供される自動インクリメント ID ジェネレーターは、通常、トランザクションの範囲外で動作するため、適切な代理キーを生成します。

さらに読む:代理キー

于 2011-02-16T13:48:14.550 に答える
2

クエリは次のようなものです:

SELECT MIN(tableFoo.uniqueid + 1) AS nextID
FROM tableFoo
LEFT JOIN tableFoo tf1
       ON tableFoo.uniqueid + 1 = tf1.uniqueid
WHERE tf1.uniqueid IS NULL
于 2011-02-16T13:23:58.443 に答える