2012-05-04 4 views
2

У меня есть существующая база данных с несколькими столбцами. Одним из них является «Язык», который указывает язык других данных в строке.Изменение дизайна базы данных после создания

Дизайн, который я хочу реализовать, будет прост в редактировании, если в базе данных еще не было пары тысяч строк.

Что я хочу сделать, это выбрать все отдельные языки (английский, испанский, французский, quenya ...) - мы можем предположить, что все они в нижнем регистре и помещают эти данные в свою таблицу.

В таблице я хочу создать будет структурирован просто:

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

Затем я хотел бы изменить свою исходную таблицу, а вместо колонки «Language» (который я буду удалять), я хочу указать номер соответствующего идентификатора языка.

Так, например, английский строка будет выглядеть следующим образом:

IrrelevantInfo | LanguageID 
foobar   |  1 

Можно ли мне сделать это без потери всех данных?

+0

Почему бы просто не оставить существующие данные как «английский», «французский» и т. Д. И сделать это основным ключом вашей новой таблицы вместо 1, 2, 3? –

+1

@TonyAndrews, например. Название языка может быть непоследовательным (немецкий против Deutch vs Allemagne vs Германски), даже если они согласуются сейчас. – SWeko

+0

ОК, но если они теперь совместимы, и вы сделаете их внешним ключом к вашей новой таблице, тогда они будут вынуждены быть последовательными и в будущем! –

ответ

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. Обновление LanguageID в существующей таблице с использованием таблицы языков с соединением в столбце language.
  5. Удалить столбец language из существующей таблицы.
Смежные вопросы