我在db中有一列有5列但没有主键。 其中一列名为myTable_id,为整数。
我想检查表是否有主键列。如果没有,则将myTable_id设为主键列并使其成为标识列。有没有办法做到这一点?
我试过这个:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
我在Management studio中遇到语法错误。
答案 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
答案 1 :(得分:9)
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
答案 2 :(得分:3)
IDENTITY
约束无法添加到现有列,因此您添加此内容的方式需要您最初的想法。有两种选择:
还有第三种方法,通过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)
我认为你不能那样做。为了将列添加到标识列中,我认为您必须完全删除该表。