2017-01-09 2 views
0

私はSQL Server 2012で作業しています:SQL Serverプライマリキーのデータ型を変更します

私はINTとして主キー列を持つテーブルを持っています。これをGUIDに変更する必要があります。

テーブルを変更してint列を主キーとして削除しますか?

GUID列を追加してプライマリとして設定し、古いINT列を削除しますか?

ありがとうございます。

答えて

2

エラー以下につながる、そのデータ型を変更するには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新しいテーブルをお勧めします、そのデータを挿入あなたが少なく、ダウンタイム以下

0

がある可能性があります
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 
関連する問題