как могут отсутствовать значения в колонке IDENTITY (1,1) - PullRequest
0 голосов
/ 03 июля 2019

В существующем приложении есть таблица User_Log с колонкой с последовательным идентификатором.

[id] [int] IDENTITY(1,1) NOT NULL

Однако при проверке таблицы я обнаружил, что в этой таблице строк 1.3M пропущено 16 874 пропущенных идентификатора.

При вставке строки в эту таблицу в какой момент назначается следующее значение идентификатора?
Идентификатор увеличивается, но данные не записываются, если триггер OnInsert завершается неудачей?
Какие еще ошибки могут привести к тому, что ни одна строка не будет записана, но ID увеличится?

Этот запрос показывает недостающие идентификаторы.

WITH Missing (miss_ID, maxid)
AS
(
 SELECT 1 AS miss_ID, (select max(id) from user_log)
 UNION ALL
 SELECT miss_ID + 1, maxid FROM Missing
 WHERE miss_ID < maxid
)
SELECT miss_ID
FROM Missing
LEFT OUTER JOIN user_log UL on UL.id = Missing.miss_ID
WHERE UL.id is NULL
OPTION (MAXRECURSION 0)
;

Я пытаюсь исключить удаление записей в журнале активности пользователей, это было бы плохо.

Спасибо за помощь в этом.

1 Ответ

1 голос
/ 03 июля 2019

При вставке строки в эту таблицу в какой момент назначается следующее значение идентификатора?

Значение генерируется перед вставкой. И он не транзакционный, так как другие сеансы могут немедленно генерировать последовательные значения, не дожидаясь, пока не завершится ли вставка успешно и зафиксирована ли она.

Увеличивается ли ID, но не записываются ли данные в случае сбоя триггера OnInsert?

Да.

Какие еще виды ошибок могут привести к тому, что ни одна строка не будет записана, но ID увеличен?

Любой сбой или откат транзакции, содержащей вставки в таблицу, оставит пробелы в значениях IDENTITY. Также SQL Server кэширует блоки сгенерированных значений идентичности по умолчанию, и сбой процесса SQL Server оставит пробелы, обычно около 1000 значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...