1

SQL Server 2005 データベース テーブルに挿入されるレコードに ID 番号を割り当てようとしています。これらのレコードは削除できるため、これらのレコードにテーブルで最初に使用可能な ID を割り当てたいと思います。たとえば、次のテーブルがある場合、次のレコードを ID 4 で入力したいと思います。ID 4 が最初に利用できるからです。

    | ID | Data |
    | 1  | ...  |
    | 2  | ...  |
    | 3  | ...  |
    | 5  | ...  |

私がこれを行う方法は、SQL クエリを介して利用可能な ID のリストを作成することです。そこから、アプリケーションのコード内ですべてのチェックを行うことができます。

要約すると、特定のテーブル列から 1 から 99999 までの使用可能なすべての ID を取得する SQL クエリが必要です。

4

5 に答える 5

0

キーをループすることもできます。空のものをヒットしたら、それを選択してループを終了します。

DECLARE @intStart INT, @loop bit
SET @intStart = 1 
SET @loop = 1

WHILE (@loop = 1)
BEGIN
    IF NOT EXISTS(SELECT [Key] FROM [Table] Where [Key] = @intStart)
        BEGIN
        SELECT @intStart as 'FreeKey'
        SET @loop = 0
        END

SET @intStart = @intStart + 1
END
GO

そこから、好きなようにキーを使用できます。@intStop を設定してループ フィールドを制限しても問題ありません。

于 2013-07-25T13:07:46.787 に答える
-1

多くの人は、テーブルの主キーに自動インクリメント整数または long 値を使用しており、しばしばIDまたはMyEntityID類似したものと呼ばれます。この列は、自動インクリメント整数であるため、多くの場合、格納されているデータ自体とは関係ありません。

これらのタイプの「主キー」は、代理キーと呼ばれます。それらには意味がありません。多くの人は、これらのタイプの ID が連続していることを好みますが、これは「見た目が美しい」ためです。しかし、これは時間とリソースの無駄です。データベースは、どの ID が使用され、どの ID が使用されていないかをあまり気にしません。

これを行うのを忘れて、ID 列の自動インクリメントのままにしておくことを強くお勧めします。また、テーブル内の各レコードを一意に識別できる列 (のサブセット) で構成されるテーブルにインデックスを作成する必要があります (このインデックスを主キー インデックスとして使用することも検討してください)。それを達成するためにすべての列を使用する必要があるまれなケースでは、テーブル内のすべての列に対してインデックスを作成するのは効率的ではない可能性があるため、自動インクリメント主キー ID が非常に役立ちます。それでも、データベース エンジンはこの ID をあまり気にしません (たとえば、どの ID が使用されているか、使用されていないかなど)。

また、整数ベースの ID には合計で最大 42 億の ID があることも考慮してください。短い時間で整数ベースの ID の供給を使い果たすことはほとんどありません。これは、この種のことが時間とリソースの無駄である理由についての議論をさらに強化します。

于 2013-07-25T12:55:59.367 に答える