2010-09-01 4 views
3

Я использую SQL Server 2008. Один столбец int, который я использовал как первичный ключ, но не столбец идентификаторов (значение которого будет увеличено на 1 автоматически). Я хочу преобразовать этот столбец в столбец идентификаторов. Любые решения?SQL Server преобразовать столбец в столбец идентификатора

спасибо заранее, Джордж

ответ

6

К сожалению, вы не можете изменить поле на 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 
+1

@Quassnoi - +1 стоит упомянуть, что для вставки данных в новый столбец Identity OP придется использовать 'SET IDENTITY_INSERT ON | OFF' – codingbadger

+1

@Barry: хорошая точка, спасибо – Quassnoi

+0

Зачем мне нужно установить IDENTITY_INSERT ВЫКЛ наконец? Мне кажется, мне нужно включить столбец идентификаторов в таблице. Я должен установить его? – George2

2

Перейти к объекту таблицы в обозревателе объектов в SQL сервере правой кнопкой мыши на столе говорят изменения, чем нажать на поле, которое является первичным ключом, который вы хотите преобразовать в идентичности, чем ниже вы увидите свойства столбца, там вам нужно изменить как (Is Identity) Да и Idendity Increment 1.

+0

Да, он будет делать это, но это плохой метод для использования. Он делает то, что описывает @Quassnoi, но если вы собираетесь вносить изменения в таблицу, они не должны выполняться через графический интерфейс, а только через скрипты, которые находятся в элементе управления Source. Это гарантирует, что процесс будет протестирован и правильно запущен на всех серверах, а ошибки не будут сделаны, а также история изменений и кто их создал. T-SQl - это код, его следует рассматривать как таковой. – HLGEM

+1

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

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