web-dev-qa-db-ja.com

SQL Server:主キーの名前を変更します

doc.MyTableに名前を変更して廃止したいテーブルdoc._MyTableがあります。次に、古いdoc.MyTableと同じ主キーを使用して新しいdoc.MyTableを作成します。問題は、SQLServerが主キーがすでに存在すると言っていることです。つまり、古い主キーの名前も変更する必要があります。

私は以下を試しました:

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はこれをスローしますが、

PRIMARYKEY制約「PK_MyTable」への違反。オブジェクト 'PK.MyTable'に重複するキーを挿入できません。
重複するキー値は(10358930、336000、0)です。`

新しいテーブルの新しい主キーを作成しようとすると。

一度に使用しているのは、2つの「メソッド」のうちの1つだけです。問題を解決するにはどうすればよいですか?

7
user3685285

次の解決策を試してください。

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

例:

EXEC sp_rename '[doc].[_MyTable].[PK_MyTable]', '[PK__MyTable]'
6
Bogdan Sahlean

主キーの名前を変更するときは、次のように主キー名の前にスキーマとテーブル名を付けます。

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
SqlZim