【问题标题】:Add primary key column in SQL table在 SQL 表中添加主键列
【发布时间】:2012-02-06 10:14:59
【问题描述】:

我是 RDBMS 的学生。

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

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

【问题讨论】:

  • 删除列和删除主键约束是不同的事情。因此,您的第一行不清楚。您也可以发布您对此的尝试并解释您遇到的问题吗?
  • 你真正想要什么?
  • 您不想在整个序列完成之前保留“旧”RowId 吗?这个“旧”的 RowId 是否也应该是 IDENTITY?为什么要用同名的列替换一列?

标签: sql-server sql-server-2005


【解决方案1】:

在 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 的任何地方,您都必须将这些占位符替换为实际来自您自己的数据库的表/约束名称(在您的问题中您没有提到它们是什么.....)

【讨论】:

  • Msg 5074,级别 16,状态 1,第 4 行对象“PK_tempTable”依赖于列“RowId”。
  • 好吧,然后包含一个ALTER TABLE dbo.YourTable DROP CONSTRAINT PK_tempTable - PK 是否被称为表名以外的其他名称?如果您的约束未被称为 PK_YourTable ,那么您当然必须相应地调整我的脚本
  • 我认为这不受限制,它显示在关键文件夹中
  • 我检查了 OBJECT_ID('dbo.tempTable') 没有返回正确的 objectid
  • @SOFUser:是的 - 当然 - 毕竟它是一个主要的 KEY - 但这仍然是一个表 constraint
【解决方案2】:

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

  • 添加新列(注意:每个表只能有一个 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 用户:我有个更好的主意。问一个更好的问题,不要无礼。你在我回答时更改了问题,我在评论中要求澄清。
【解决方案3】:

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

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

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

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

您可以在IDENTITY 关键字之后的括号之间指定seed(和increment)值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-17
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多