在SQL表中添加主键列

问题描述:

我是RDBMS的学生。在SQL表中添加主键列

我有一个很基本的问题,比方说我在SQL Server中有一个现有的表。什么是脚本来改变表格。

  • 删除'RowId'列(如果存在)。
  • 如果存在,则禁止碰撞。
  • 将一个新列'RowId'添加到表中。
  • 将此列作为主键。
  • 自动增量类型int。
+1

删除列和删除主键约束是不同的事情。你的第一行不清楚。你也可以发布你的尝试,并解释你卡在哪里? – Oded 2012-02-06 10:16:33

+0

你真的想要什么? – 2012-02-06 10:17:23

+0

您是否不想保留“旧”RowId,直到完成整个序列?这个“旧”RowId是否也应该是IDENTITY?为什么用同一个名字替换一个列? – gbn 2012-02-06 10:28:17

在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,必须更换从你自身的数据库实际表/约束名称的占位符(你没有提到它们是什么,你的问题.....)

+0

表没有在任何地方折回,但仍然失败...... – 2012-02-06 10:28:04

+0

消息5074,级别16,状态1,行4 对象'PK_tempTable'依赖于'RowId'列。 – 2012-02-06 10:28:25

+0

那么,然后包括一个'ALTER TABLE dbo.YourTable DROP CONSTRAINT PK_tempTable' - 是PK的名称比表名称?如果你的约束没有被称为'PK_YourTable',你必须相应地修改我的脚本**,当然! – 2012-02-06 10:29:18

注:问题之前加入这个答案更新

  • 添加新列(注:你只能有每个表中的一个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

+7

@SOF用户:我有一个更好的主意。提出更好的问题,不要粗鲁。我在回答时改变了问题,并要求在评论中予以澄清。 – gbn 2012-02-06 10:34:15

只是一个评论,以改善这些伟大的答案(不能使用评论 - 我是一个信誉点远离这一特权),并为自己将来参考:

一个新的身份(自动编号)柱可以添加和制作在单个语句中的主键,以及:

ALTER TABLE无论ADD行ID INT IDENTITY NOT NULL PRIMARY KEY;

我不喜欢在没有帮助时打扰约束名称。