Столбец SQL Identity увеличивается на 2 или 3 - PullRequest
0 голосов
/ 22 марта 2010

У меня есть новая кластерная база данных, и я перемещаю данные в таблицы из нашей старой базы данных. Когда я импортирую данные, все работает нормально, но когда я вручную вставляю запись, столбец Identity не следует за следующим идентификационным номером. Так, например, я импортирую 100 записей в таблицу, и столбец Identity показывает 1-100, но если я затем вручную добавлю строку в базу данных, получу 102 или 103, а не 101.

Есть идеи, почему это происходит?

Это происходит во всех моих таблицах, и это очень расстраивает, так как иногда разрыв между идентичностями достигает 4 или 5.

Ответы [ 5 ]

2 голосов
/ 22 марта 2010

Вы не должны зависеть от столбцов идентификаторов, следующих какому-либо определенному шаблону (например, всегда увеличиваясь только на 1). Единственная гарантия состоит в том, что значения в настоящее время в таблице будут уникальными.

2 голосов
/ 22 марта 2010

ИМО, не стоит обращать внимание на пробелы в столбцах идентичности. Весь смысл такого суррогатного ключа (в отличие от естественного ключа) состоит в том, что вам не нужно беспокоиться о какой-либо «правильности».

Теперь, как сказал Робин, у вас могут быть откаты или ошибки, которые вызывают пробелы в идентичности.

Другая вещь, которая может вызвать пробелы, - это определение самой идентичности. Запустите это утверждение и посмотрите, что я имею в виду

Declare @MyTable table ( MyColumn1 Int Identity (1, 5))

INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values
INSERT INTO @MyTable Default Values

SELECT * FROM @MyTable
1 голос
/ 22 марта 2010

Если вы «тестируете» свою вставку в транзакции и откате. И тогда вы запускаете это по-настоящему. Вставка внутри транзакции увеличивает единицу поля идентификатора на единицу, даже если вы затем отката.

0 голосов
/ 16 июня 2010

Если вы добавляете строку через SSMS и пытаетесь вставить строку и сталкиваетесь с любым типом нарушения ограничений (например, нарушение типа данных или нарушение внешнего ключа), идентификатор увеличивается на 1, хотя строка не была успешно вставленастол.Это может быть что происходит?

0 голосов
/ 22 марта 2010

Нельзя полагаться на то, что столбцы идентификаторов всегда будут последовательными, поскольку приращение поддерживается SQL Server и сохраняется между транзакциями. Хотя это приращение сбрасывается при изменении структуры таблицы или при переключении SET IDENTITY_INSERT на ON и обратно на OFF, я бы не советовал.

Если вы действительно зависите от последовательных идентификаторов, вам следует создать столбец без идентификатора и написать собственную логику, чтобы убедиться, что он остается последовательным.

...