创建后更改数据库设计

Sim*_*ely 2 sql database sql-server database-design sql-server-2008

我有一个包含许多列的现有数据库.其中一个是"语言",表示行中其他数据的语言.

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

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

我想创建的表格将简单地构建:

Language ID    |   Language   |   Shorthand for language
1              |    English   |    en-us 
Run Code Online (Sandbox Code Playgroud)

然后,我希望编辑我的原始表,并且,代替"语言"列(我将删除),我希望输入相应语言ID的编号.

因此,例如,英文行将如下所示:

IrrelevantInfo   |   LanguageID
foobar           |     1
Run Code Online (Sandbox Code Playgroud)

我可以在不丢失所有数据的情况下这样做吗?

JNK*_*JNK 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
Run Code Online (Sandbox Code Playgroud)

我还强烈建议在该LanguageId字段上添加索引,并重建所有索引,尤其是聚簇索引.添加和删​​除列会对表和索引的碎片造成严重破坏.