Добавить столбец первичного ключа в таблице 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;
Я предпочитаю не беспокоиться об именах ограничений, когда это не помогает.