Вопрос о пропуске идентификаторов в столбце идентификаторов в MSSQL - PullRequest
3 голосов
/ 23 октября 2008

Скажем, у меня есть таблица MSSQL с двумя столбцами: столбец int ID, который является столбцом идентификаторов, и некоторый другой столбец datetime или любой другой. Скажем, в таблице 10 записей с идентификаторами 1-10. Теперь я удаляю запись с ID = 5.

Существуют ли сценарии, в которых другая запись будет "заполнять" этот отсутствующий идентификатор? То есть когда будет вставлена ​​запись с номером 5?

Ответы [ 3 ]

7 голосов
/ 23 октября 2008

Нет, если только вы специально не включите вставку идентификаторов (обычно это делается при копировании таблиц со столбцами идентификаторов) и вручную вставьте строку с идентификатором 5. SQLServer отслеживает последний идентификатор, вставленный в каждую таблицу со столбцами идентификаторов, и увеличивает последний вставленное значение для получения следующего значения при вставке.

2 голосов
/ 23 октября 2008

Только если вы вручную отключаете идентификаторы с помощью команды SET IDENTITY_INSERT, а затем делаете вставку с ID = 5

В противном случае MS-SQL всегда будет увеличиваться до большего числа, а пропущенные слоты никогда не будут использоваться повторно.

0 голосов
/ 23 октября 2008

Один сценарий, который еще не упомянут, где другая запись будет «заполнять» пропущенные значения IDENTITY, - это когда 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.

...