我在db中有一列有5列但没有主键。 其中一列被命名为myTable_id并且是整数。如果表中没有主键,将列设置为主键
我想检查表是否有主键列。如果没有,那么使myTable_id成为主键列并使其成为标识列。有没有办法做到这一点?
我试着用这样的:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
,我得到语法错误在管理工作室。
我在db中有一列有5列但没有主键。 其中一列被命名为myTable_id并且是整数。如果表中没有主键,将列设置为主键
我想检查表是否有主键列。如果没有,那么使myTable_id成为主键列并使其成为标识列。有没有办法做到这一点?
我试着用这样的:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID
ALTER TABLE Persons
ADD PRIMARY KEY (P_Id)
,我得到语法错误在管理工作室。
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id)
身份栏怎么样? –
“我想检查表是否有主键列”没有解决。 – Monkey
,这种检查是否存在主键,如果没有则创建
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
您可以使用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;
我认为@ISHASPRIMARYKEY将只有null,如果Persons表不存在,否则它将为0或1,这取决于是否存在主键。 – KnarfaLingus
@KnarfaLingus - 你是对的。我做了一个编辑,但是我的代表目前还不够高,所以我必须等待它获得批准。 –
的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自动分配一个名称。
只有在PRIMARY KEY
上包含CLUSTERED
,如果搜索特定P_ID的余额和写入的数量超过了通过某个其他索引对表进行聚类的好处。请参阅Create SQL IDENTITY
as PRIMARY KEY
。
你应该标记一个答案为接受。 –