在SQL表中添加主键列
我是RDBMS的学生。在SQL表中添加主键列
我有一个很基本的问题,比方说我在SQL Server中有一个现有的表。什么是脚本来改变表格。
- 删除'RowId'列(如果存在)。
- 如果存在,则禁止碰撞。
- 将一个新列'RowId'添加到表中。
- 将此列作为主键。
- 自动增量类型int。
在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.YourTable
或PK_YourTable
,必须更换从你自身的数据库实际表/约束名称的占位符(你没有提到它们是什么,你的问题.....)
表没有在任何地方折回,但仍然失败...... – 2012-02-06 10:28:04
消息5074,级别16,状态1,行4 对象'PK_tempTable'依赖于'RowId'列。 – 2012-02-06 10:28:25
那么,然后包括一个'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
@SOF用户:我有一个更好的主意。提出更好的问题,不要粗鲁。我在回答时改变了问题,并要求在评论中予以澄清。 – gbn 2012-02-06 10:34:15
只是一个评论,以改善这些伟大的答案(不能使用评论 - 我是一个信誉点远离这一特权),并为自己将来参考:
一个新的身份(自动编号)柱可以添加和制作在单个语句中的主键,以及:
ALTER TABLE无论ADD行ID INT IDENTITY NOT NULL PRIMARY KEY;
我不喜欢在没有帮助时打扰约束名称。
删除列和删除主键约束是不同的事情。你的第一行不清楚。你也可以发布你的尝试,并解释你卡在哪里? – Oded 2012-02-06 10:16:33
你真的想要什么? – 2012-02-06 10:17:23
您是否不想保留“旧”RowId,直到完成整个序列?这个“旧”RowId是否也应该是IDENTITY?为什么用同一个名字替换一个列? – gbn 2012-02-06 10:28:17