К сожалению, вы не можете изменить поле на IDENTITY
на существующую таблицу.
Вы должны:
- Создать новую таблицу с
IDENTITY
поля
- Выпуском
SET IDENTITY_INSERT ON
для новой таблицы
- вставки данных в новую таблицу
- Выпуск
SET IDENTITY_INSERT OFF
для новой таблицы
- Удалить старый стол
- Переименуйте новую таблицу в старое имя.
Чтобы изменить тип поля, вы можете использовать SSMS
, он сделает все это за кулисами.
Вот пример таблицы:
CREATE TABLE plain (id INT NOT NULL PRIMARY KEY)
INSERT
INTO plain
VALUES (1000)
и сценарий, порожденный SSMS
:
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_plain
(
id int NOT NULL IDENTITY (1, 1)
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_plain SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_plain ON
GO
IF EXISTS(SELECT * FROM dbo.plain)
EXEC('INSERT INTO dbo.Tmp_plain (id)
SELECT id FROM dbo.plain WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_plain OFF
GO
DROP TABLE dbo.plain
GO
EXECUTE sp_rename N'dbo.Tmp_plain', N'plain', 'OBJECT'
GO
ALTER TABLE dbo.plain ADD CONSTRAINT
PK__plain__3213E83F1A609306 PRIMARY KEY CLUSTERED
(
id
) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
COMMIT
@Quassnoi - +1 стоит упомянуть, что для вставки данных в новый столбец Identity OP придется использовать 'SET IDENTITY_INSERT ON | OFF' – codingbadger
@Barry: хорошая точка, спасибо – Quassnoi
Зачем мне нужно установить IDENTITY_INSERT ВЫКЛ наконец? Мне кажется, мне нужно включить столбец идентификаторов в таблице. Я должен установить его? – George2