在SQL表中添加主键列

SOF*_*ser 19 sql-server sql-server-2005

我是RDBMS的学生.

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

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

mar*_*c_s 47

在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
Run Code Online (Sandbox Code Playgroud)

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

更新:当然,无论我用dbo.YourTable或者PK_YourTable,您必须更换与那些占位符实际从自己的数据库表/约束名(你没有提到它们是什么,在你的问题......)


gbn*_*gbn 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;
Run Code Online (Sandbox Code Playgroud)

随机想一想......你想重置IDENTITY列吗?
如果是,则使用DBCC CHECKIDENT

  • @SOF用户:我有一个更好的主意.问一个更好的问题,不要粗鲁.你在回答时改变了问题,我在评论中要求澄清. (7认同)

bit*_*ean 8

只是一条评论来改进这些伟大的答案(还不能使用评论 - 我距离该特权只有一个声誉点)并作为我自己未来的参考:

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

ALTER TABLE [表名] ADD [列名] int IDENTITY PRIMARY KEY;

当约束名称没有帮助时,我不想打扰它。

您可以在关键字后面的括号之间指定种子(和增量)值IDENTITY