Предполагая, вы используете SQL Server (вы отметили здесь и SQL Server, и MySQL) Похоже, вы полагаетесь на свойство IDENTITY
для надежного предоставления последовательных чисел;это не так.Согласно документации, CREATE TABLE (Transact-SQL) IDENTITY (Свойство) :
Столбцы идентификаторов могут использоваться для генерации значений ключей.Свойство удостоверения в столбце гарантирует следующее:
- Последовательные значения в транзакции - транзакция, вставляющая несколько строк, не гарантирует получение последовательных значений для строк
, так как другие параллельные вставки могут происходить настол.Если значения
должны быть последовательными, то транзакция должна использовать исключительную блокировку
для таблицы или уровень изоляции SERIALIZABLE. - Последовательные значения после перезапуска сервера или других ошибок - SQL Server может кэшировать значения идентификаторовпо соображениям производительности и некоторые
назначенных значений могут быть потеряны при сбое базы данных или при перезапуске
сервера.Это может привести к пробелам в значении идентичности при
вставке.Если пропуски неприемлемы, приложение должно использовать
свой собственный механизм для генерации значений ключей.Использование генератора последовательностей
с опцией NOCACHE может ограничить разрывы для транзакций, которые
никогда не совершаются.
Если вам нужно гарантировать, что числа последовательны ввремя выполнения , вы можете ROW_NUMBER()
:
SELECT ROW_NUMBER () OVER (ORDER BY ID) AS RN
[Name]
FROM YourTable;
Для идентификаторов вряд ли найдется хорошая причина, по которой вы хотите, чтобы они были непрерывными.Наличие «пробелов» в ваших значениях идентификаторов на самом деле не имеет значения, поскольку ограничения и индексы (внешний ключ) не заботятся о наличии пробелов или нет.