Изменение семени 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.