【问题标题】:SQL Server : rename primary keySQL Server:重命名主键
【发布时间】:2017-09-21 09:40:31
【问题描述】:

我有一个表 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

方法一抛出此错误:

在当前数据库“db_dev”中找不到名称为“PK_MyTable”的项目,因为@itemtype 输入为“(null)”。

虽然方法 2 抛出了这个:

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

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

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

【问题讨论】:

  • 方法一和方法二不清楚。
  • 方法是指上面代码中的“尝试”。我将其全部更改为“方法”以使其更清晰。

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


【解决方案1】:

尝试以下解决方案:

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

例子:

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

【讨论】:

    【解决方案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 重命名主键。

    【讨论】:

    • 您不需要使用N'[_MyTable]',这将创建一个名为... [[_MyTable]] 的表。只需使用'_MyTable'_MyTable反正不用转义,可以写select * from doc._MyTable
    • @PanagiotisKanavos 已更正
    【解决方案3】:

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

    ALTER TABLE dbo.YourOldTable
    DROP CONSTRAINT YourConstraintname;   
    

    【讨论】:

    • 这应该是评论,而不是答案。另外sp_rename也没什么问题
    • 我没说有。删除索引并使用不同的名称阅读是一个完全有效的答案,如果不是首选的话。
    • 实际上这是一个非常糟糕且昂贵的答案。这意味着索引必须重建,这是一个非常昂贵的操作。主键通常是聚集索引,这意味着整个表必须转换为堆,然后再转换回聚集索引结构
    • 这不是和我第二次尝试的一样吗?
    • @user3685285 sqlzim 发布了正确答案。如果使用dbo 以外的模式,则必须使用三部分名称,即schema.table.name
    猜你喜欢
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2010-09-23
    • 2013-04-24
    • 2013-04-11
    相关资源
    最近更新 更多