繁体   English   中英

SQL Server:重命名主键

[英]SQL Server : rename primary key

我有一个表doc.MyTable ,我想通过重命名为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抛出此错误:

在@itemtype输入为'(null)'的情况下,当前数据库'db_dev'中找不到名为'PK_MyTable'的项目。

方法2抛出这个:

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

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

我一次只使用两种“方法”中的一种。 我该如何解决这个问题?

尝试以下解决方案

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

例:

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

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

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重命名主键。

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

ALTER TABLE dbo.YourOldTable
DROP CONSTRAINT YourConstraintname;   

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM