Подтвердить что ты не робот

Установите столбец как первичный ключ, если таблица не имеет первичного ключа

У меня есть столбец в db, который имеет 5 столбцов, но не первичный ключ. Один из столбцов называется myTable_id и является целым числом.

Я хочу проверить, есть ли столбец первичного ключа. Если это не так, сделайте myTable_id столбцом первичного ключа и сделайте его столбец идентификаторов. Есть ли способ сделать это?

Я попытался с этим:

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

и я получаю синтаксическую ошибку в студии управления.

4b9b3361

Ответ 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

Я не думаю, что вы можете это сделать. Для того, чтобы сделать столбец в столбце идентификации, я думаю, вам нужно полностью отказаться от таблицы.