Добавить столбец первичного ключа в таблице SQL

Я участвую в РСУБД.

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

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

Ответы

Ответ 1

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

-- 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

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

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

Ответ 2

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

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

Пример script:

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;

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

Ответ 3

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

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

ALTER TABLE Независимо от ADD RowID int IDENTITY NOT NULL PRIMARY KEY;

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