2012-05-04 9 views
2

私は既存のデータベースにいくつかの列を持っています。これらのうちの1つは、行内の他のデータの言語を示す「言語」です。作成後のデータベース設計の変更

私が実装したい設計は、データベースがまだ数千もの行を持っていなければ、簡単に編集できます。

個別の言語(英語、スペイン語、フランス語、クエンヤ...)をすべて選択するだけです。これらはすべて小文字であるとみなし、このデータを独自のテーブルに入れます。私が作成したい

の表は、単純に構造化されます。

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

私はその後、私の元のテーブルを編集したい、そして、(私は削除させていただきます)「言語」欄の代わりに、私は望みます対応する言語IDの番号を入力します。

ので、例えば、英語の行は次のようになります。

IrrelevantInfo | LanguageID 
foobar   |  1 

は、それが可能に私は私のすべてのデータを失うことなく、これを行うためですか?

+0

既存のデータを '英語'、 'フランス語'などのままにしておき、1,2,3の代わりに新しいテーブルの主キーにするのはなぜでしょうか? –

+1

@TonyAndrews言語の名前は一貫していても一貫性がない(ドイツ語対ドイツ語対Allemagne対Германски)。 – SWeko

+0

OKですが、現在一貫性があり、それらを新しいテーブルの外部キーにすると、将来も一貫性を保つように強制されます。 –

答えて

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. languageの結合を持つ言語テーブルを使用して、既存のテーブルのLanguageIDを更新します。
  5. 既存のテーブルから列languageを削除します。
関連する問題