Установите столбец как первичный ключ, если таблица не имеет первичного ключа
У меня есть столбец в db, который имеет 5 столбцов, но не первичный ключ.
Один из столбцов называется myTable_id и является целым числом.
Я хочу проверить, есть ли столбец первичного ключа. Если это не так, сделайте myTable_id столбцом первичного ключа и сделайте его столбец идентификаторов. Есть ли способ сделать это?
Я попытался с этим:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
и я получаю синтаксическую ошибку в студии управления.
Ответы
Ответ 1
Это проверяет, существует ли первичный ключ, если он не создан
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'Persons'
AND TABLE_SCHEMA ='dbo')
BEGIN
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
END
ELSE
BEGIN
-- Key exists
END
скрипт: http://sqlfiddle.com/#!6/e165d/2
Ответ 2
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
Ответ 3
Вы можете проверить, существует или нет первичный ключ OBJECTPROPERTY Transact SQL, используйте 'TableHasPrimaryKey'
для вторых аргументов.
DECLARE @ISHASPRIMARYKEY INT;
SELECT @ISHASPRIMARYKEY = OBJECTPROPERTY(OBJECT_ID('PERSONS'), 'TABLEHASPRIMARYKEY');
IF @ISHASPRIMARYKEY IS NULL
BEGIN
-- generate identity column
ALTER TABLE PERSONS
DROP COLUMN P_ID;
ALTER TABLE PERSONS
ADD P_ID INT IDENTITY(1,1);
-- add primary key
ALTER TABLE PERSONS
ADD CONSTRAINT PK_PERSONID PRIMARY KEY (P_ID);
END;
Ответ 4
Ограничение IDENTITY
не может быть добавлено в существующий столбец, поэтому, как вы это добавляете, это будет ваша первоначальная мысль. Существует два варианта:
- Создайте новую таблицу, включая первичный ключ с идентификатором и отпустите существующую таблицу
- Создайте новый столбец первичного ключа с идентификатором и удалите существующий столбец "P_ID"
Существует третий способ, который лучше подходит для очень больших таблиц с помощью инструкции ALTER TABLE...SWITCH
. См. Добавление IDENTITY
в существующий столбец для примера каждого из них. В ответ на этот вопрос, если таблица не слишком велика, я рекомендую запустить следующее:
-- Check that the table/column exist and no primary key is already on the table.
IF COL_LENGTH('PERSONS','P_ID') IS NOT NULL
AND NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = 'PERSONS')
-- Add table schema to the WHERE clause above e.g. AND TABLE_SCHEMA ='dbo'
BEGIN
ALTER TABLE PERSONS
ADD P_ID_new int IDENTITY(1, 1)
GO
ALTER TABLE PERSONS
DROP COLUMN P_ID
GO
EXEC sp_rename 'PERSONS.P_ID_new', 'P_ID', 'Column'
GO
ALTER TABLE PERSONS
ADD CONSTRAINT PK_P_ID PRIMARY KEY CLUSTERED (P_ID)
GO
END
Примечания:
Явным образом используя ключевое слово CONSTRAINT
, для ограничения первичного ключа задано конкретное имя, а не в зависимости от SQL Server для автоматического назначения имени.
Включить CLUSTERED
в PRIMARY KEY
, если баланс поиска для конкретного P_ID и количество записи перевешивают преимущества кластеризации таблицы каким-либо другим индексом. См. Создать SQL IDENTITY
как PRIMARY KEY
.
Ответ 5
Я не думаю, что вы можете это сделать. Для того, чтобы сделать столбец в столбце идентификации, я думаю, вам нужно полностью отказаться от таблицы.