2017-01-09 103 views
0

我正在SQL Server 2012上工作:SQL Server更改主鍵數據類型

我有一個主鍵列爲INT的表。我需要將其更改爲GUID。

我是否改變表格並將int列作爲主鍵?

添加GUID列並將其設置爲Primary並刪除舊的INT列?

謝謝。

回答

2

您不能更改主鍵列,除非刪除it..Any操作來改變它的數據類型將導致以下錯誤..

對象「PK__t1__7D78A4E7」是依賴於列「ID 」。

唯一的選擇是

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) 

從2012年,有一種叫做(DROP_EXISTING = ON)子句其使事情變得簡單,通過在最後階段刪除聚集索引,並保持所有操作的舊索引。但在你的情況下,這個子句將不起作用..

所以我建議

1,創建新表所需的模式和索引,從舊錶新表
3.最後在開關時不同的名稱
2.插入數據,插入數據得到了積累
4.Rename表舊錶名

這樣,你可能有更少的停機時間

0

下面是一個腳本,我寫來幫助我們部署了更改主鍵列的數據類型。

此腳本假定根據此列沒有任何非主鍵約束(例如外鍵)。

這個腳本有一些安全檢查,因爲這是爲了部署到不同的服務器(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