ID 列である int ID 列と、その他の日時などの列の 2 つの列を持つ MSSQL テーブルがあるとします。テーブルに ID が 1 ~ 10 の 10 個のレコードがあるとします。ここで、ID = 5 のレコードを削除します。
別のレコードが不足している ID を「埋める」シナリオはありますか? つまり、いつレコードが挿入され、ID 5 が与えられるのでしょうか?
ID 列である int ID 列と、その他の日時などの列の 2 つの列を持つ MSSQL テーブルがあるとします。テーブルに ID が 1 ~ 10 の 10 個のレコードがあるとします。ここで、ID = 5 のレコードを削除します。
別のレコードが不足している ID を「埋める」シナリオはありますか? つまり、いつレコードが挿入され、ID 5 が与えられるのでしょうか?
ID 挿入 (通常は ID 列を含むテーブルをコピーするときに行う) を明示的に有効にし、id 5 で手動で行を挿入しない限り、いいえ。挿入時に次の値を取得します。
SET IDENTITY_INSERT コマンドを使用して ID ID を手動でオフにしてから、ID=5 で挿入を行う場合のみ
そうしないと、MS-SQL は常により大きな数に増加し、不足しているスロットが再利用されることはありません。
別のレコードが欠落しているIDENTITY値を「埋める」という、まだ言及されていない1つのシナリオは、IDENTITYが再シードされる場合です。例(SQL Server 2008):
CREATE TABLE Test
(
ID INTEGER IDENTITY(1, 1) NOT NULL,
data_col INTEGER NOT NULL
);
INSERT INTO Test (data_col)
VALUES (1), (2), (3), (4);
DELETE
FROM Test
WHERE ID BETWEEN 2 AND 3;
DBCC CHECKIDENT ('Test', RESEED, 1)
INSERT INTO Test (data_col)
VALUES (5), (6), (7), (8);
SELECT T1.ID, T1.data_col
FROM Test AS T1
ORDER
BY data_col;
結果は次のとおりです。
ID data_col
1 1
4 4
2 5
3 6
4 7
5 8
これは、「穴」が新しい自動生成された値で埋められるだけでなく、再シードの前に自動生成された値が再送信され、既存のIDENTITY値を複製できることを示しています。