我在 db 中有一个列,它有 5 列但没有主键。其中一列名为 myTable_id 并且是整数。
我想检查表是否有主键列。如果不是,则将 myTable_id 设为主键列并将其设为标识列。有没有办法做到这一点?
我试过这个:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
我在 Management Studio 中遇到语法错误。
我在 db 中有一个列,它有 5 列但没有主键。其中一列名为 myTable_id 并且是整数。
我想检查表是否有主键列。如果不是,则将 myTable_id 设为主键列并将其设为标识列。有没有办法做到这一点?
我试过这个:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
我在 Management Studio 中遇到语法错误。
这会检查主键是否存在,如果不存在则创建
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
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
不能将IDENTITY
约束添加到现有列,因此如何添加它需要是您最初的想法。有两种选择:
还有第三种方法,这是通过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
.
您可以使用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;
我不认为你能做到这一点。为了使一列成为标识列,我认为您必须完全删除该表。