我需要將表中的主鍵列的類型從int更改爲guid。數據庫已經有我不想丟失的數據,並且有外鍵可以考慮。有沒有一種無痛的方式來做到這一點,或者我必須通過一個大的**腳本手動做到這一點?:)我會很感激任何建議sql服務器將PK類型從int更改爲uniqueidentifier
5
A
回答
5
你將不得不用艱難的方式,使用腳本:
在單用戶模式1)新的GUID列添加到主表
0)獲得,並且填充它。
2)新的FK列添加到每個子表並填充它們與一個UPDATE FROM
UPDATE c
SET FKcolumn=p.NewGuid
FROM ChildTable c
INNER JOIN ParentTable p ON p.OldIntID=c.OldIntId
3)刪除現有的INT FKS
4)刪除舊INT列
5)添加新的指南列上的FK
6)退出單用戶模式
您應該能夠讓SQL Server Management Studio生成用於添加和刪除列和鍵的腳本。只需在SSMS中進行更改,然後單擊「生成更改腳本」工具欄圖標,即可將代碼剪切並粘貼到文本文件中。
0
- 在數據庫中使用選項「生成腳本」以創建「DROP/CREATE CONSTRAINT和INDEXES」(使用高級按鈕來調整嚮導)。 運行創建的SQL腳本的一部分來刪除索引和約束。
創建一個輔助函數和過程如下:
CREATE FUNCTION [dbo].[GuidFromHash] ( @Input nvarchar(MAX) ) RETURNS nvarchar(MAX) AS BEGIN RETURN LOWER(SUBSTRING(@Input, 1,8)+'-'+SUBSTRING(@Input, 9,4)+'-'+SUBSTRING(@Input, 13,4)+'-'+SUBSTRING(@Input, 17,4)+'-'+SUBSTRING(@Input, 21,12)) END CREATE PROCEDURE [dbo].[bigIntToGuid] ( @table varchar(50), @column varchar(50) ) AS DECLARE @SQL VARCHAR(MAX) SET @SQL='UPDATE @Table SET @Column=dbo.HashToGuid(''cc''+CONVERT(VARCHAR, HASHBYTES(''MD5'',LTRIM(@Column)),2))' SET @SQL=REPLACE(@SQL,'@Table',@Table) SET @SQL=REPLACE(@SQL,'@Column',@Column) EXEC(@SQL) SET @SQL='SELECT * FROM @Table' SET @SQL=REPLACE(@SQL,'@Table',@Table) SET @SQL=REPLACE(@SQL,'@Column',@Column) EXEC(@SQL)
現在到了人工作業的每個表:
-
在設計師
- 打開表(SQL Management Studio或其他工具)
- 將bigint類型的列更改爲VARCHAR(50)
- 執行「EXEC bigIntToGuid'myTable','myBigIntColumn'
- 回表設計更改列類型爲「唯一標識符」
- 您也可以選擇添加默認值:NEWID(),和/或設置列作爲主鍵
- 打開SQL生成的腳本在步驟1中創建
- 選擇腳本的約束和索引創建的唯一部分,並執行它
這種方法可以確保轉換的int GUID,並保持數據的完整性。
+0
SQL代碼段中存在拼寫錯誤:HashToGuid應該讀取GuidFromHash,或者函數名稱應該更改爲HashToGuid。 – 2017-05-30 19:12:43
相關問題
- 1. 從bigint中將列的數據類型更改爲uniqueidentifier
- 2. SQL Server將字段類型從數字更改爲int
- 3. SQL服務器:轉換從字符串轉換爲uniqueidentifier
- 4. 誤差變換數據bigint類型爲int [SQL服務器]
- 5. SQL服務器數據類型int Vs Big int
- 6. 在數據庫項目中將Int更改爲uniqueidentifier
- 7. 在SQL服務器中將NULL從NVARCHAR列更改爲NOT NULL
- 8. 將主鍵類型從int更改爲bigint
- 9. postgreSQL同時將列類型從int更改爲bigint
- 10. 如何在Sql Server中將序列類型從int更改爲bigint
- 11. Infopath - 更改sql服務器
- 12. 在SQL服務器中更改域子類型
- 13. SQL-Server - 操作數類型衝突:uniqueidentifier與int
- 14. Pyspark更改DF類型從Double到Int
- 15. SQL服務器 - 結果空間不足uniqueidentifier值轉換爲char
- 16. Nodejs將服務器HTTP更改爲HTTPS
- 17. Sql Server - 將UniqueIdentifier中的列更改爲varchar(128) - 向後兼容?
- 18. 將CSV存儲到服務器而不更改數據類型
- 19. Node.js服務器從localhost更改爲apache
- 20. 更改SQL中的PK值
- 21. 在SQL Server類型爲int的更改列中鍵入文本
- 22. 將數據類型DECIMAL從CSV導入到SQL服務器
- 23. 如何將日期更改爲毫秒毫秒SQL服務器
- 24. 在sql server中將列類型從bigint更改爲數字(18,0)
- 25. 將SQL列從浮點更改爲小數類型
- 26. 將SQL Server RDS實例類型從Web更改爲標準版
- 27. 爲什麼eclipse要求我將此int變量的類型更改爲int []?
- 28. 連接的數據庫服務器不支持從'uniqueidentifier'到'int'的轉換
- 29. SQL服務器事務複製,更改分發服務器
- 30. 在遠程機器中將服務啓動類型更改爲Delayed(自動)
你爲什麼要這樣做?我目前正在嘗試相反的... – cjk 2010-03-29 14:11:27
我也是,寧願建議**不要**這樣做 - 任何特殊原因? – 2010-03-29 14:58:38
我需要這樣做,因爲我設置了多個訂閱服務器的合併複製,並且我不希望我的行ID由於同步而發生更改。另外,因爲合併複製會自動在所有表中添加一個guid列,如果你不準備有一個guid PK col,則一個aditional int id colun是多餘的。 – anakic 2010-03-30 06:40:44