在SQL表中添加主键列

时间:2012-02-06 10:15:00

标签: sql-server sql-server-2005

我是RDBMS的学生。

我有一个非常基本的问题,就是说我在SQL服务器中有一个现有的表。什么是改变表的脚本。

  • 删除列'RowId'(如果存在)。
  • 如果存在则删除约束。
  • 在表格中添加一个新列'RowId'。
  • 将此列设为主键。
  • 自动增量类型int。

3 个答案:

答案 0 :(得分:42)

在SQL Server 2005或更高版本中,您可以使用此脚本:

-- drop PK constraint if it exists
IF EXISTS (SELECT * FROM sys.key_constraints WHERE type = 'PK' AND parent_object_id = OBJECT_ID('dbo.YourTable') AND Name = 'PK_YourTable')
   ALTER TABLE dbo.YourTable
   DROP CONSTRAINT PK_YourTable
GO

-- drop column if it already exists
IF EXISTS (SELECT * FROM sys.columns WHERE Name = 'RowId' AND object_id = OBJECT_ID('dbo.YourTable'))
    ALTER TABLE dbo.YourTable DROP COLUMN RowId
GO

-- add new "RowId" column, make it IDENTITY (= auto-incrementing)
ALTER TABLE dbo.YourTable 
ADD RowId INT IDENTITY(1,1)
GO

-- add new primary key constraint on new column   
ALTER TABLE dbo.YourTable 
ADD CONSTRAINT PK_YourTable
PRIMARY KEY CLUSTERED (RowId)
GO

当然,如果其他表使用外键约束将dbo.YourTable引用到预先存在的RowId列上,则此脚本可能仍会失败...

更新:当然,在我使用dbo.YourTablePK_YourTable的任何地方,您必须使用实际替换这些占位符你自己数据库中的表/约束名称(你没有在你的问题中提到它们是什么......)

答案 1 :(得分:8)

注意:在更新问题之前添加了此答案

  • 添加新列(注意:每个表只能有一个IDENTITY列)
  • 删除旧主键
  • 添加新主键
  • 根据需要删除旧列

示例脚本:

CREATE TABLE whatever (
     OldPKColumn uniqueidentifier NOT NULL, 
     CONSTRAINT PK_whatever PRIMARY KEY (OldPKColumn)
    )

ALTER TABLE whatever
    ADD RowId int NOT NULL IDENTITY (1,1);

ALTER TABLE whatever
    DROP CONSTRAINT PK_whatever;

ALTER TABLE whatever WITH CHECK
    ADD CONSTRAINT PK_whatever PRIMARY KEY CLUSTERED (RowId);

ALTER TABLE whatever
    DROP COLUMN oldPKcolumn;

一个随意的想法......你想重置IDENTITY列吗? 如果是,请使用DBCC CHECKIDENT

答案 2 :(得分:3)

只是评论来改进这些出色的答案(暂时不能使用评论 - 我是远离该特权的一个声誉点)以及作为我自己的未来参考:

可以添加新的IDENTITY(自动编号)列,并将主键设置为单个语句:

  

ALTER TABLE [TableName] ADD [ColumnName] int IDENTITY PRIMARY KEY;

在没有帮助的情况下,我宁愿不打扰约束名称。

您可以在IDENTITY关键字之后的parantheses之间指定种子(以及增量)值。