我有一个表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).`
当我尝试为新表创建新的主键时。
我只使用其中一种"方法"一次。我该如何解决这个问题?
答案 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;