Вы не можете обновить значения столбца идентификаторов, а также не можете удалить идентификатор из столбца, обновить значения и установить его обратно. Необходимо создать новую таблицу с той же схемой, скопировать данные из старой таблицы, но для ID сгенерировать новое значение, отбросить старую таблицу и переименовать новую, чтобы сохранить то же имя.
use [tempdb]
go
if OBJECT_ID('TestTable') is not null
drop table TestTable
go
create table TestTable (
ID int not null primary key clustered identity(1,1)
, Name varchar(50)
)
insert into TestTable(Name) values
('Row #1'),('Row #2'),('Row #3'),
('Row #4'),('Row #5'),('Row #6'),
('Row #7'),('Row #8'),('Row #9')
delete from TestTable where ID in (3, 4, 8) -- Make some gaps
create table TestTable_NEW (
ID int not null primary key clustered identity(1,1)
, Name varchar(50)
)
insert into TestTable_NEW(Name)
select Name
from TestTable
order by ID -- Preserve the rows order
drop table TestTable
exec sp_rename N'TestTable_NEW', N'TestTable'
Однако я не буду рекомендовать делать это вообще. Значения идентичности должны быть неизменными. Они не должны никогда меняться. Если у вас есть проблемы с пробелами, не допускайте удаления существующих записей. Кроме того, идентичность не гарантирует , что в последовательности не будет пробелов. Только что значения будут уникальными и растущими. Так что вам определенно следует пересмотреть свою базу данных и / или дизайн приложения, потому что он имеет недостатки.