SQL Server:重命名主键

时间:2017-04-24 15:52:57

标签: sql-server tsql primary-key rename ddl

我有一个表doc.MyTable,我想通过重命名为doc._MyTable来弃用它。然后,我想创建一个新的doc.MyTable,其中包含与旧doc.MyTable相同的主键。问题是SQL Server说主键已经存在。这意味着我还需要重命名旧的主键。

我尝试了以下内容:

EXEC SP_RENAME 'doc.MyTable', '_MyTable'

-- Method 1
EXEC SP_RENAME 'PK_MyTable', 'PK__MyTable'

-- Method 2
ALTER TABLE [doc].[_MyTable] DROP CONSTRAINT [PK_MyTable]
ALTER TABLE [doc].[_MyTable] ADD CONSTRAINT [PK__MyTable]
PRIMARY KEY CLUSTERED
(
    [document_id] ASC,
    [line_id] ASC,
    [sub_line_id] ASC
)

-- Create new table
CREATE TABLE [doc].[MyTable] (
    ... columns
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED (
    ... key columns
)
... extra conditions

方法1抛出此错误:

  

没有名称为' PK_MyTable'可以在当前数据库中找到db_dev',因为@itemtype被输入为'(null)'。

虽然方法2抛出了这个:

  

违反PRIMARY KEY约束' PK_MyTable'。无法在对象' PK.MyTable'中插入重复键。
重复键值为(10358930,336000,0).`

当我尝试为新表创建新的主键时。

我只使用其中一种"方法"一次。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

尝试以下解决方案:

EXEC sp_rename '[TableSchema].[TableName].[ConstraintName]', 'NewConstraintName'

示例:

EXEC sp_rename '[doc].[_MyTable].[PK_MyTable]', '[PK__MyTable]'

答案 1 :(得分:2)

重命名主键时,请在主键名前加上架构和表名,如下所示:

create schema doc authorization dbo;
go
create table doc.MyTable (
    id int not null
  , constraint pk_MyTable primary key clustered (Id)
);
exec sp_rename N'doc.MyTable.pk_MyTable', N'pk__MyTable';
exec sp_rename N'doc.MyTable', N'_MyTable', N'object';
create table doc.MyTable (
    id int not null
  , constraint pk_MyTable primary key clustered (Id)
);

rextester演示:http://rextester.com/OBIB87116

如果您使用的是默认架构dbo,则无需为架构和表名添加前缀,以使用sp_rename重命名主键。

答案 2 :(得分:-1)

你不能从原始表中删除它并用你想要的名称重新创建吗?

ALTER TABLE dbo.YourOldTable
DROP CONSTRAINT YourConstraintname;