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つだけです。問題を解決するにはどうすればよいですか?
次の解決策を試してください。
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
に変更するために、スキーマとテーブル名のプレフィックスを付ける必要はありません。