30

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

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

我试过这个:

ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)

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

4

5 回答 5

49

这会检查主键是否存在,如果不存在则创建

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

于 2013-02-01T13:22:36.493 回答
7
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
于 2013-02-01T13:13:33.507 回答
3

不能将IDENTITY约束添加到现有列,因此如何添加它需要是您最初的想法。有两种选择:

  1. 创建一个包含具有标识的主键的新表并删除现有表
  2. 创建具有标识的新主键列并删除现有的“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 来自动分配一个名称。

仅包括CLUSTEREDPRIMARY KEY搜索特定 P_ID 的平衡和写入量超过通过其他索引对表进行集群的好处时。请参阅将SQL 创建IDENTITYPRIMARY KEY.

于 2015-11-12T14:04:05.797 回答
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;
于 2013-02-01T13:28:54.177 回答
0

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

于 2013-02-01T13:25:40.897 回答