2009-01-22 36 views
1

我目前有一個包含約20個參考表的數據庫,即產品,資產,倉庫,用戶等等。這些信息存儲在中央數據庫中,並下載到外出工程師的PDA上。我的數據庫中的每個表都有一個UniqueIdentifier PK(即一個GUID)。SQL Server - 更改PK數據類型的最佳方法是什麼?

我經歷了兩年的產品開發之後才意識到,我永遠不會做,也永遠不需要編輯任何這些ref表。因此,他們不需要將UniqueIdentifiers作爲主鍵。

當我在我的web服務將它們發送到PDA之前序列化所有集合時,由於GUID的長度,實際的序列化數據非常龐大。

無論如何,要做到這一點 - 我想將表格的所有PK都改爲IDENTITY Ints。有沒有簡單的方法來做到這一點,或者我將不得不沿着切斷所有FK,創建臨時表,然後編寫一些軟件來重新映射數據?

在此先感謝。

回答

2

如果你有FK引用你的PK,你會遇到很大的麻煩。 我猜你因爲應用程序(PDA)的分佈式特性而使用GUID,並且可能最初的意圖可能是從這些PDA添加新數據,在這種情況下GUID是理想的。缺點是你不能在GUID上索引。

我的建議是不要使用身份證明開始。首先,禁用你的FK。爲所有對該PK的引用添加一個INT(不是標識)的新列(即所有對它有FK的表)。然後爲每個GUID創建一個新的int(下一個值),並將其插入到guid中,並在其他表中引用對guid的所有引用。然後爲整數打開新的FK,然後將你的PK移到你的新的int列。最後刪除你的GUID列,然後重建你的索引。

希望不是太亂碼。

0

只要你有一些獨特的領域(或一組領域),你可以重新分配PK到該領域。即如果你不需要一個GUID,你可能不需要一個IDENTITY代理鍵。最簡單的做法就是在一個或多個唯一的非空現有列上使用PK。

否則,只需添加一個IDENTITY列並將PK重新分配給它。 (當你保存修改後的表格時它會填充。)然後你可以用guid刪除列。 (我假設我們正在討論這個問題,因爲你的guid列目前沒有用於任何東西,即使它是另一個表中的FK,如果你有獨特的列加入,你不需要它在那裏,或者)。

如果這些都不符合您的情況,請再次發佈更多詳細信息。這可以做一點小事或打擾。

(我不知道爲什麼你認爲你需要uniqueidentifiers爲您的主鍵,即使表將被編輯的,順便說一句。)

0

好吧,我不明白的是,一方面你說明你不需要Id列,但是通過你的Web服務發送它們。

所以,我會先看看我的查詢,看返回的結果集是什麼被提取和優化。

更改PK是很大的努力,但藉助「SQL比較」可以完成。

3

首先 - 大聲笑。我認識貴公司的其他人......「哇 - GUID很酷,我將在各地使用它們......」至少你認識到走這條路的其中一個問題。

二 - 你可能會發現這些命令有所幫助:

exec sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL' 

<do stuff here> 

exec sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL' 

三 - 它說:待辦事宜的東西這裏 -

1) add an int autoincrementing identity column to ref table 
2) set the current fk guid in data tables to the db key you just created in step 1 
3) rinse/repeat for each ref table/data table combination 
4) after all is done, refactor code to use id (int) instead of guid 

我要離開的GUID獨自幾個月零件以防萬一你需要調整/修復任何東西。在將來的某個時候,你應該能夠從你的ref表中刪除guid。

相關問題