我正在SQL Server 2012上工作:SQL Server更改主鍵數據類型
我有一個主鍵列爲INT的表。我需要將其更改爲GUID。
我是否改變表格並將int列作爲主鍵?
添加GUID列並將其設置爲Primary並刪除舊的INT列?
謝謝。
我正在SQL Server 2012上工作:SQL Server更改主鍵數據類型
我有一個主鍵列爲INT的表。我需要將其更改爲GUID。
我是否改變表格並將int列作爲主鍵?
添加GUID列並將其設置爲Primary並刪除舊的INT列?
謝謝。
您不能更改主鍵列,除非刪除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表舊錶名
這樣,你可能有更少的停機時間
下面是一個腳本,我寫來幫助我們部署了更改主鍵列的數據類型。
此腳本假定根據此列沒有任何非主鍵約束(例如外鍵)。
這個腳本有一些安全檢查,因爲這是爲了部署到不同的服務器(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