2012-05-04 90 views
2

我有一個包含多個列的現有數據庫。其中之一是「語言」,它表示行中其他數據的語言。創建後更改數據庫設計

如果數據庫中沒有幾千行,我希望實現的設計將很容易編輯。

我想要做的是選擇所有不同的語言(英語,西班牙語,法語,德語...) - 我們可以假設這些都是小寫,並將這些數據放入自己的表中。

我希望創建的表將結構簡單:

Language ID | Language | Shorthand for language 
1    | English | en-us 

然後我想編輯我的原始表,並在地方「語言」欄(我將刪除),祝輸入相應的語言編號。

因此,例如,英語行將看起來像:

IrrelevantInfo | LanguageID 
foobar   |  1 

是否有可能爲我做到這一點,而不會失去我的數據?

+0

爲什麼不把現有數據保留爲「英語」,「法語」等,並將其作爲新表的主鍵而不是1,2,3? –

+1

@TonyAndrews例如即使語言現在一致,語言的名稱也可能不一致(德語對德奇,對德國對德國對德國)。 – SWeko

+0

好的,但如果它們現在一致,並且讓它們成爲新表格的外鍵,那麼它們在將來也必須保持一致。 –

回答

6

當然。

像這樣的東西應該工作:

CREATE TABLE Languages (id int identity NOT NULL PRIMARY KEY, 
         [Language] varchar(100), 
         Shorthand varchar(100)) 

BEGIN TRAN -- We do a transaction here to ensure consistency 

INSERT INTO Languages ([Language]) 
SELECT DISTINCT [Language] 
FROM MySourceTable 

-- Update the shorthands later 


ALTER TABLE MySourceTable 
ADD LanguageID int 
FOREIGN KEY REFERENCES Languages(id) 

UPDATE t 
SET LanguageID = l.id 
FROM MySourceTable T 
INNER JOIN Languages l 
    ON l.[Language] = t.[Language] 

ALTER TABLE MySourceTable 
DROP [Language] 

COMMIT TRAN 

我也強烈建議在LanguageId場添加索引,並重建所有的指標,尤其是聚簇索引。添加和刪​​除列會嚴重破壞表和索引的碎片。

2

確實有可能。

  1. 創建新的語言表。
  2. 將現有表格中的不同語言插入到語言表中。
  3. 將列LanguageID添加到您現有的表中。
  4. 更新LanguageID在現有表中使用語言表加入列language
  5. 從您現有的表中刪除列language