Добавить столбец первичного ключа в таблицу SQL - PullRequest
17 голосов
/ 06 февраля 2012

Я изучаю RDBMS.

У меня есть очень простой вопрос, скажем, у меня есть одна существующая таблица в SQL-сервере.Что будет сценарием для изменения таблицы.

  • Удалить столбец 'RowId', если существует.
  • Удалить ограничение, если существует.
  • Добавить один новый столбец 'RowId' втаблица.
  • Сделать этот столбец первичным ключом.
  • Тип автоинкремента int.

Ответы [ 3 ]

44 голосов
/ 06 февраля 2012

В SQL Server 2005 или новее вы можете использовать этот скрипт:

-- drop PK constraint if it exists
IF EXISTS (SELECT * FROM sys.key_constraints WHERE type = 'PK' AND parent_object_id = OBJECT_ID('dbo.YourTable') AND Name = 'PK_YourTable')
   ALTER TABLE dbo.YourTable
   DROP CONSTRAINT PK_YourTable
GO

-- drop column if it already exists
IF EXISTS (SELECT * FROM sys.columns WHERE Name = 'RowId' AND object_id = OBJECT_ID('dbo.YourTable'))
    ALTER TABLE dbo.YourTable DROP COLUMN RowId
GO

-- add new "RowId" column, make it IDENTITY (= auto-incrementing)
ALTER TABLE dbo.YourTable 
ADD RowId INT IDENTITY(1,1)
GO

-- add new primary key constraint on new column   
ALTER TABLE dbo.YourTable 
ADD CONSTRAINT PK_YourTable
PRIMARY KEY CLUSTERED (RowId)
GO

Конечно, этот скрипт может все еще не работать, если другие таблицы ссылаются на это dbo.YourTable, используя ограничения внешнего ключа на ранее существовавший столбец RowId ...

Обновление: и , конечно , где бы я ни использовал dbo.YourTable или PK_YourTable, вы должны заменить эти заполнители на фактическую таблицу / ограничение имена из вашей собственной базы данных (вы не упомянули, что они были, в вашем вопросе .....)

8 голосов
/ 06 февраля 2012

Примечание: этот ответ был добавлен до обновления вопросов

  • Добавить новый столбец (примечание: в таблице может быть только один столбец IDENTITY)
  • Удалить старый первичный ключ
  • Добавить новый первичный ключ
  • Удалить старый столбец при необходимости

Пример сценария:

CREATE TABLE whatever (
     OldPKColumn uniqueidentifier NOT NULL, 
     CONSTRAINT PK_whatever PRIMARY KEY (OldPKColumn)
    )

ALTER TABLE whatever
    ADD RowId int NOT NULL IDENTITY (1,1);

ALTER TABLE whatever
    DROP CONSTRAINT PK_whatever;

ALTER TABLE whatever WITH CHECK
    ADD CONSTRAINT PK_whatever PRIMARY KEY CLUSTERED (RowId);

ALTER TABLE whatever
    DROP COLUMN oldPKcolumn;

И случайная мысль ... вы пытаетесьсбросить столбец IDENTITY?
Если это так, используйте DBCC CHECKIDENT

3 голосов
/ 14 декабря 2017

Просто комментарий, чтобы улучшить эти замечательные ответы (пока не могу использовать комментарии - у меня одна репутация вдали от этой привилегии) ​​и в качестве будущей ссылки для меня:

Можно добавить новый столбец IDENTITY (autonumber) и сделать его первичным ключом в одном выражении:

ALTER TABLE [TableName] ДОБАВИТЬ [ColumnName] int ИДЕНТИЧНЫЙ КЛЮЧ ПЕРВИЧНЫЙ;

Я предпочитаю не беспокоиться об именах ограничений, когда это не помогает.

Вы можете указать начальное значение приращение ) между разделами после ключевого слова IDENTITY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...