Изменение семени Identity в SQL Server (постоянно!)
Есть ли способ изменить семантику идентичности для столбца идентификации на постоянной основе? Использование DBCC CHECKIDENT просто похоже на значение last_value. Если таблица усечена, все значения reset.
dbcc checkident ('__Test_SeedIdent', reseed, 1000)
select name, seed_value, increment_value, last_value
from sys.identity_columns
where [object_id] = OBJECT_ID('__Test_SeedIdent');
возвращает
name seed_value increment_value last_value
-------------------------------------------------
idIdent 1 1 1000
Я надеялся, что некоторый синтаксис вроде
alter table dbo.__Test_SeedIdent alter column idIdent [int] identity(1000,1) NOT NULL
.
Нужно ли создавать новый столбец, перемещать значения поперек, удалять исходный столбец и переименовывать новый?
Ответы
Ответ 1
Из книг в Интернете:
"Чтобы изменить исходное начальное значение и переместить все существующие строки, вы должны удалить столбец идентификатора и воссоздать его, указав новое начальное значение. Когда таблица содержит данные, идентификационные номера добавляются к существующим строкам с указанным семенем и значения приращения. Порядок, в котором обновляются строки, не гарантируется."
Ответ 2
MSSQL не позволяет вам легко добавлять или изменять идентификатор в существующем столбце через TSQL. Вам нужно будет удалить столбец и снова добавить его. Излишне говорить, что это может сыграть в ад с отношениями FK. Вы можете сделать это непосредственно в менеджере предприятия. Однако это не будет весело, если вам нужно сделать это с большим количеством столбцов.
Необходимо ли создать новый столбец, переместите значения поперек, отбросьте оригинальной колонке и переименовать новый?
Yup и не забудьте исправить/обновить все индексы, отношения внешних ключей и т.д., привязанные к этому столбцу
Ответ 3
"Нужно ли создавать новый столбец, перемещать значения поперек, удалять исходный столбец и переименовывать новый?"
Фактически в Enterprise Manager, когда вы добавляете столбец идентификатора в существующую таблицу (или изменяете поле INT PK на INT PK ID), он делает это за сценой.
Ответ 4
Вы можете использовать DBCC CHECKIDENT('tablename', RESEED, seedvalue)
Пример: DBCC CHECKIDENT('Customers',RESEED, 1350)
DBCC CHECKIDENT('Customers')
запустите DBCC CHECKIDENT('Customers')
чтобы проверить, было ли установлено текущее начальное значение.
Однако, как упоминалось в предыдущих ответах, это не изменит существующие значения, хранящиеся в столбце идентификаторов. Это только изменит начальное значение, поэтому следующая строка будет начинаться с этого значения. Приращение идентичности остается тем же самым (не изменяется) и не может быть изменено с помощью DBCC.