2008-09-26 51 views
7

我使用幾個帶整數主鍵的引用表。現在我想將整數更改爲GUID,並保持所有引用完好無損。最簡單的方法是什麼?從整數移動到GUID作爲主鍵

謝謝!

加成

我明白一般的過程,所以我需要更詳細的建議,例如,如何填寫新的GUID列。使用默認值newid()是正確的,但對於已經存在的行是什麼?

+0

作爲未來讀者的**警告**:僅在_careful_考慮之後應用uniqueidentifiers(GUID)作爲主鍵:通常這不是一個好主意。 – DdW 2017-02-08 08:44:11

回答

11
  • 在主表的GUID 值創建一個新列。使用 uniqueidentifier數據類型,使其 非空,並使用newid()缺省值,所以 將填充所有現有行。
  • 在子表中創建新的uniqueidentifier列 。
  • 運行更新語句以使用存在的int關係來引用實體來構建公會關係。
  • 刪除原始的int列。

此外,留有一定的空間在您的數據/索引頁(指定填充因子< 100)GUID是不連續的,比如說int標識列。這意味着插入可以在數據範圍內的任何地方,並且如果您的頁面100%已滿,將導致頁面拆分。

4

首先:親愛的上帝爲什麼?!?!?其次,你將不得不首先將GUID列添加到所有表中,然後根據int值填充它們。完成後,您可以將GUID設置爲主鍵/外鍵,然後刪除int列。

,以更新要像做

  1. 設置新的GUID在主鍵表
  2. 運行此值:

UPDATE foreignTable f 
SET f.guidCol = p.guidCol 
FROM primaryTable p 
WHERE p.intCol = f.intCol 
+0

我同意格倫。我會堅持使用PK的整數。如果您需要更多記錄,請使用bigint。如果您需要全局標識符,請使用類似於URI的內容作爲輔助鍵,並使用PK的整數。 – 2008-09-26 07:45:44

+0

但是如何在主鍵表中設置新的GUID? – 2008-09-26 08:24:26

+0

2 Alexander Prokofyev:將所有「guid」PK列的默認clausule設置爲「newid()」。 2 marxidad:如果您需要在另一個環境(例如winforms應用程序)中創建級聯記錄,則使用Guid而不是(big)int非常有用。 – TcKs 2008-09-26 08:43:11

2

是的,我與格倫...我其實是在猶豫張貼同樣的事情,他發佈之前....

爲什麼你會不希望自動增量int主鍵分開從你的GUID?它的很多更靈活,你可以有GUID列索引,以便你有你的查詢性能好...


至於靈活性,我喜歡讓我的ID是自動增量整數,因爲這樣其他看似獨特的主鍵值得一提的項目可以改變。

靈活性的一個很好的例子是如果您使用用戶名作爲主鍵。即使它們是獨一無二的,它也能很好地改變它們。如果用戶使用電子郵件地址作爲用戶名會怎麼樣?能夠更改用戶名並使其不會影響您的所有查詢是一大優勢,我懷疑您的GUID也可能是這樣的......

0

我認爲,您必須手動操作。或者你可以爲它寫一些實用程序。該場景應該是:

  • 用新的「guid」列複製「int」PK/FK列。
  • 爲「guid」PK列生成新值。
  • 更新具有指定值的「guid」FK列中的值(您可以通過「int」PK找到記錄)。
  • 用「int」PK/FK列移除引用(關係)。
  • 與「guid」PK/FK列創建類似的引用(關係)。
  • 刪除「int」PK/FK列。
3

這是相關係統,實現分佈式計算模型。如果系統在系統中持久存儲信息時需要知道主鍵,則使用由處理器維護的自動遞增主鍵會減慢系統運行速度。相反,您需要像GUID生成器這樣的機制來創建主鍵(請記住,主鍵的真正特徵是其唯一性)。所以,我可以擴展多個服務,每個服務都獨立於彼此創建主鍵。

我之前有過這樣做的可疑特權,基本上我所要做的就是將整個該死的數據庫導出到XML中。接下來,我有一個Java應用程序,它使用java.util.Random的nextLong()函數將主鍵替換爲新的guid鍵。之後,我將整個事情導入數據庫。

當然,我第一次嘗試導入XML文件時,我忘記關閉主鍵字段的自動編號功能,所以請從我的錯誤中學習。我確信有更好的方式來做到這一點,但這是一種快速而骯髒的做法......並且它很有效。如果你想知道,該項目是爲了使應用程序規模。

0

這是一個非常不錯的選擇。我從一個應用程序切換到UUID,我不後悔。如果您使用MS SQL Server,它將包含在標準中(我使用postgresql,它只包含在8.3以上的標準中)。

Glenn Slaven一樣,您可以使用當前記錄中的鍵重新創建UUID。請注意,它們不會是唯一的,但這樣很容易保持關係不變。移動後創建的新記錄將是唯一的。

0

不要這樣做!我們開始使用GUID,現在我們幾乎完成了作爲PK的INTs;我們保留了用於記錄目的的GUID(以及某些表格,呃,「可協商的關係完整性」)),但是使用整數的速度增加是驚人的。

這隻有當表格行數跨越數百萬時才真正顯現出來,介意你。

我們迄今爲止最大的愚蠢是使用NEWID()作爲我們的(順序)對數表的PK - 當我們意識到我們的錯誤時,我們有很多頭疼的事情。