SQL Server:重命名主键

use*_*285 5 t-sql sql-server ddl rename primary-key

我有一个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
Run Code Online (Sandbox Code Playgroud)

方法1引发此错误:

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

尽管方法2抛出此错误:

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

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

我一次只使用两个“方法”之一。如何解决此问题?

Bog*_*ean 5

尝试以下解决方案:

EXEC sp_rename '[TableSchema].[TableName].[ConstraintName]', 'NewConstraintName'
Run Code Online (Sandbox Code Playgroud)

例:

EXEC sp_rename '[doc].[_MyTable].[PK_MyTable]', '[PK__MyTable]'
Run Code Online (Sandbox Code Playgroud)


小智 -3

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

ALTER TABLE dbo.YourOldTable
DROP CONSTRAINT YourConstraintname;   
Run Code Online (Sandbox Code Playgroud)

  • 事实上,这是一个非常糟糕且昂贵的答案。这意味着必须“重建”索引,这是一个非常昂贵的操作。主键通常是聚集索引,这意味着“整个表”必须转换为堆,然后再转换回聚集索引结构 (3认同)