如果表没有主键,则将列设置为主键

时间:2013-02-01 13:10:05

标签: tsql

我在db中有一列有5列但没有主键。 其中一列名为myTable_id,为整数。

我想检查表是否有主键列。如果没有,则将myTable_id设为主键列并使其成为标识列。有没有办法做到这一点?

我试过这个:

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

我在Management studio中遇到语法错误。

5 个答案:

答案 0 :(得分:47)

检查主键是否存在,如果不存在则

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

答案 1 :(得分:9)

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)

答案 2 :(得分:3)

IDENTITY约束无法添加到现有列,因此您添加此内容的方式需要您最初的想法。有两种选择:

  1. 创建一个新表,其中包含具有标识的主键并删除现有表
  2. 使用标识创建新的主键列,然后删除现有的' P_ID'柱
  3. 还有第三种方法,通过ALTER TABLE...SWITCH语句对于非常大的表是更好的方法。有关每个的示例,请参阅Adding an IDENTITY to an existing column。在回答这个问题时,如果表格不是太大,我建议运行以下内容:

    -- 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来自动分配名称。

    如果特定P_ID的搜索余额和写入量超过了通过其他索引对表进行聚类的好处,则只在CLUSTERED上包含PRIMARY KEY。请参阅Create SQL IDENTITY as PRIMARY KEY

答案 3 :(得分:2)

您可以使用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 :(得分:0)

我认为你不能那样做。为了将列添加到标识列中,我认为您必须完全删除该表。