2011-01-04 3 views
3

У меня есть таблица со столбцом IDENTITYЗаполнение пробелов в значениях столбца IDENTITY

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

После того, как некоторые строки неоспоримым добавлены/удалены я заканчиваются пробелы в значениях Id:

Id Name 
--------- 
1 Tom 
2 Bill 
4 Kate 

Есть простой способ сжать значения до

Id Name 
--------- 
1 Tom 
2 Bill 
3 Kate 

?

+7

Один вопрос - Почему вы хотите, чтобы сделать такую ​​вещь? – Oded

+0

Возможный дубликат столбца SQL Server и Identity (http://stackoverflow.com/questions/2537204/sql-server-and-identity-column) – Oded

+0

Мне нужно это, чтобы синхронизировать две разные базы данных. Я не могу контролировать часть, которая требует, чтобы столбцы идентификаторов были в последовательности. Хорошо, что эта таблица очень редко обновляется и имеет менее 100 записей. – Max

ответ

3

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

Лёгкость может оказаться под вопросом, если бы тонна FK отношений восстановить с другими таблицами и т.д.

+0

Я думаю, что это путь.Благодаря! – Max

+0

У меня есть случай с тоннами FK на столы. Я использую небольшое поле для поля UserId в пользовательской таблице с автоповтором, я обнаружил, что у меня никогда не будет более 32.767 пользователей (неподвижные изображения сохраняются) Becouse UserId table находится в тоннах таблиц, я не хочу измените тип поля на int, поскольку он также увеличит используемое пространство (4 байта/2 байта). – Burnsys

1

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

8

Я бы настоятельно рекомендую вам оставить значение идентификаторов, как они.

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

Если есть какая-то бизнес-логика, где они должны быть последовательными, то добавьте новый столбец ID_Display, где вы можете обновить их с помощью ROW_NUMBER() и сохранить их для конечного пользователя. Я никогда не позволяю конечным пользователям видеть и/или диктовать, как я создаю/заполняю/храню данные, и если они беспокоят вас об идентификаторах, тогда показывайте им некоторые другие данные, которые выглядят как идентификатор, но не являются FK или PK.

+1

Я отвечаю на этот вопрос, но я сделаю шаг дальше; Я действительно не могу думать о действительном случае бизнес-логики, в котором было бы целесообразно быть зависимым от или ожидать определенного порядка значений идентичности. –

1

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

Похоже, что существует программная логика, предполагающая отсутствие пробелов - правильно?

Мне нужно это, чтобы синхронизировать две разные базы данных.

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

DELETE FROM db1.table 
SELECT col1, col2, col3 /* leave out the IDENTITY column */ 
INTO db1.table FROM db2.table 
+0

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

Смежные вопросы