创建后更改数据库设计
问题描述:
我有一个包含多个列的现有数据库。其中之一是“语言”,它表示行中其他数据的语言。创建后更改数据库设计
如果数据库中没有几千行,我希望实现的设计将很容易编辑。
我想要做的是选择所有不同的语言(英语,西班牙语,法语,德语...) - 我们可以假设这些都是小写,并将这些数据放入自己的表中。
我希望创建的表将结构简单:
Language ID | Language | Shorthand for language
1 | English | en-us
然后我想编辑我的原始表,并在地方“语言”栏(我将删除),祝输入相应的语言编号。
因此,例如,英语行将看起来像:
IrrelevantInfo | LanguageID
foobar | 1
是否有可能为我做到这一点,而不会失去我的数据?
答
当然。
像这样的东西应该工作:
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
场添加索引,并重建所有的指标,尤其是聚簇索引。添加和删除列会严重破坏表和索引的碎片。
答
确实有可能。
- 创建新的语言表。
- 将现有表格中的不同语言插入到语言表中。
- 将列
LanguageID
添加到您现有的表中。 - 更新
LanguageID
在现有表中使用语言表加入列language
。 - 从您现有的表中删除列
language
。
为什么不把现有数据保留为“英语”,“法语”等,并将其作为新表的主键而不是1,2,3? –
@TonyAndrews例如即使语言现在一致,语言的名称也可能不一致(德语对德奇,对德国对德国对德国)。 – SWeko
好的,但如果它们现在一致,并且让它们成为新表格的外键,那么它们在将来也必须保持一致。 –