私はSQL Server 2012で作業しています:SQL Serverプライマリキーのデータ型を変更します
私はINTとして主キー列を持つテーブルを持っています。これをGUIDに変更する必要があります。
テーブルを変更してint列を主キーとして削除しますか?
GUID列を追加してプライマリとして設定し、古いINT列を削除しますか?
ありがとうございます。
私はSQL Server 2012で作業しています:SQL Serverプライマリキーのデータ型を変更します
私はINTとして主キー列を持つテーブルを持っています。これをGUIDに変更する必要があります。
テーブルを変更してint列を主キーとして削除しますか?
GUID列を追加してプライマリとして設定し、古いINT列を削除しますか?
ありがとうございます。
エラー以下につながる、そのデータ型を変更するにはit..Any操作をドロップしない限り、あなたは、主キー列を変更することはできません。..
オブジェクトのPK__t1__7D78A4E7 'の列に依存している「ID '
のみ]オプションは、2012年から
1.Drop主キー
2.changeデータ型
3.recreate主キー
ALTER TABLE t1
DROP CONSTRAINT PK__t1__3213E83F88CF144D;
GO
alter table t1
alter column id varchar(10) not null
alter table t1 add primary key (id)
にあり、どの(DROP_EXISTING = ON)
と呼ばれる句があります最終段階でクラスタード・インデックスを削除し、すべての操作で古いインデックスを使用できるようにすることで、シンプルなものになります。しかし、あなたのケースでは、この節は機能しません。
だから私は、古いテーブルから
2.insertデータは、スイッチの時に3。最後
新しいテーブルに別の名前で、目的のスキーマやインデックスの
1.create新しいテーブルをお勧めします、そのデータを挿入あなたが少なく、ダウンタイム以下
がある可能性があります
4.Rename古いテーブル名
この方法にテーブルを蓄積してしまったことは、私たちが主キー列のデータ型への変更を導入を支援するために書いたスクリプトです。
このスクリプトは、この列に応じてプライマリ以外のキー制約(たとえば、外部キー)がないことを前提としています。
このスクリプトは、サーバー上でテーブルが何とか異なる場合、副作用を発生させることなく、異なるサーバー(dev、uat、live)に展開するように設計されているため、
私はこれが誰かを助けてくれることを願っています。落札する前に間違ったことが見つかった場合は、私に知らせてください。私はスクリプトを更新して嬉しいです。
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C WITH (NOLOCK) WHERE C.TABLE_CATALOG = '<<DB>>' AND C.TABLE_SCHEMA = 'dbo' AND C.TABLE_NAME = '<<Table>>'
AND C.COLUMN_NAME = '<<COLUMN>>' AND C.DATA_TYPE = 'int') -- <- Additional test to check the current datatype so this won't make unnecessary or wrong updates
BEGIN
DECLARE @pkName VARCHAR(200);
SELECT @pkName = pkRef.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pkRef WITH (NOLOCK)
WHERE pkRef.TABLE_CATALOG = '<<DB>>' AND pkRef.TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '<<Table>>'
IF(@pkName IS NOT NULL)
BEGIN
-- Make sure the primary key name is the one you are going to use in script beyond this point.
IF(@pkName != '<<PRIMARY KEY NAME>>')
BEGIN
RAISERROR ('Unexpected primary key name - The primary key found has a different name than expected. Please update the script.', 16, 1);
RETURN;
END
ALTER TABLE dbo.<<Table>>
DROP CONSTRAINT <<PRIMARY KEY NAME>>; -- Note: this is not a string or a variable (just type the PK name)
SELECT 'Dropped existing primary key';
END
ALTER TABLE dbo.<<Table>> ALTER COLUMN ID BIGINT
SELECT 'Updated column type to big int';
ALTER TABLE dbo.<<Table>>
ADD CONSTRAINT <<PRIMARY KEY NAME>> PRIMARY KEY CLUSTERED (<<COLUMN>>);
SELECT 'Created the primary key';
END
ELSE
BEGIN
SELECT 'No change required.';
END