2013-02-01 81 views
24

我在db中有一列有5列但没有主键。 其中一列被命名为myTable_id并且是整数。如果表中没有主键,将列设置为主键

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

我试着用这样的:

ALTER TABLE Persons 
DROP CONSTRAINT pk_PersonID 

ALTER TABLE Persons 
ADD PRIMARY KEY (P_Id) 

,我得到语法错误在管理工作室。

+3

你应该标记一个答案为接受。 –

回答

9
ALTER TABLE Persons 
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id) 
+1

身份栏怎么样? –

+0

“我想检查表是否有主键列”没有解决。 – Monkey

43

,这种检查是否存在主键,如果没有则创建

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

0

我不认为你可以做到这一点。为了使列成为标识列,我认为你必须完全删除表格。

+1

你不能转换为身份,但你可以添加一个标识到一个表 – Paparazzi

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; 
+1

我认为@ISHASPRIMARYKEY将只有null,如果Persons表不存在,否则它将为0或1,这取决于是否存在主键。 – KnarfaLingus

+0

@KnarfaLingus - 你是对的。我做了一个编辑,但是我的代表目前还不够高,所以我必须等待它获得批准。 –

2

IDENTITY约束不能被添加到现有列,所以你怎么加这需要是你最初的想法。有两个选项:

  1. 创建新表包括带有标识的主键和删除现有的表
  2. 创建标识的新的主键列,删除现有的“P_ID”列

还有第三种方法,对于通过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自动分配一个名称。

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