2

いくつかの列を持つ既存のデータベースがあります。これらの1つは、行内の他のデータの言語を示す「言語」です。

データベースに数千行がまだ含まれていない場合、実装したいデザインは簡単に編集できます。

私がやりたいのは、すべての異なる言語(英語、スペイン語、フランス語、クウェンヤ...)を選択することです。これらはすべて小文字であると想定し、このデータを独自のテーブルに配置できます。

私が作成したいテーブルは単純に構造化されます:

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

次に、元のテーブルを編集し、[言語]列(削除します)の代わりに、対応する言語IDの番号を入力します。

したがって、たとえば、英語の行は次のようになります。

IrrelevantInfo   |   LanguageID
foobar           |     1

すべてのデータを失うことなくこれを行うことは可能ですか?

4

2 に答える 2

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また、フィールドにインデックスを追加し、すべてのインデックス、特にクラスター化インデックスを再構築することを強くお勧めします。列の追加と削除は、テーブルとインデックスの断片化に大混乱をもたらします。

于 2012-05-04T13:02:56.880 に答える
2

確かにそれは可能です。

  1. 新しい言語テーブルを作成します。
  2. 個別の言語を既存のテーブルから言語テーブルに挿入します。
  3. LanguageID列を既存のテーブルに追加します。
  4. LanguageIDcolumn を結合した language テーブルを使用して、既存のテーブルを更新しますlanguage
  5. language既存のテーブルから列を削除します。
于 2012-05-04T13:02:01.813 に答える