创建后更改数据库设计

问题描述:

我有一个包含多个列的现有数据库。其中之一是“语言”,它表示行中其他数据的语言。创建后更改数据库设计

如果数据库中没有几千行,我希望实现的设计将很容易编辑。

我想要做的是选择所有不同的语言(英语,西班牙语,法语,德语...) - 我们可以假设这些都是小写,并将这些数据放入自己的表中。

我希望创建的表将结构简单:

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

然后我想编辑我的原始表,并在地方“语言”栏(我将删除),祝输入相应的语言编号。

因此,例如,英语行将看起来像:

IrrelevantInfo | LanguageID 
foobar   |  1 

是否有可能为我做到这一点,而不会失去我的数据?

+0

为什么不把现有数据保留为“英语”,“法语”等,并将其作为新表的主键而不是1,2,3? –

+1

@TonyAndrews例如即使语言现在一致,语言的名称也可能不一致(德语对德奇,对德国对德国对德国)。 – SWeko

+0

好的,但如果它们现在一致,并且让它们成为新表格的外键,那么它们在将来也必须保持一致。 –

当然。

像这样的东西应该工作:

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场添加索引,并重建所有的指标,尤其是聚簇索引。添加和删​​除列会严重破坏表和索引的碎片。

确实有可能。

  1. 创建新的语言表。
  2. 将现有表格中的不同语言插入到语言表中。
  3. 将列LanguageID添加到您现有的表中。
  4. 更新LanguageID在现有表中使用语言表加入列language
  5. 从您现有的表中删除列language