2011-12-15 5 views
0

Мы собираемся изменить то, что у нас есть перечисление на идентификатор связанной таблицы.Изменение из перечисления в связанную таблицу

Как бы мы это сделали?

Наше текущее имя перечисления: strat
Наше новое связано имя: stratid

То, что я имел в виду что-то вдоль линий:

UPDATE table_name 
SET stratid = (SELECT id FROM link_table WHERE stratname = table_name.strat); 

У меня не создал таблицу ссылок еще , сейчас это все теория.

Будет ли работа выше?
Есть ли что-нибудь, что я должен изменить, чтобы перевести из перечисления в связанную таблицу?

ответ

0

нет подводных камней для изготовления обновления кроме того, что вам потребности хотят сделать тройной убедитесь, что ваши link_table.id s заполняются строго в том порядке, table_name.strat параметров определены.

Например, если strat является enum('FOO', 'BAR') то в linked_table запись с id == 1 должен быть «Foo» запись.

После этого вы, возможно, захотите сделать колонку stratidNON NULL; это не является строго эквивалентом вашей предыдущей договоренности, но, вероятно, будет ближе к тому, что вы хотите.

+0

Что вы подразумеваете под 'строго в порядке'? будет несколько записей, используя один и тот же идентификатор ... – Neal

+0

@Neal: Сделано редактирование. Я имел в виду, что вы хотите (нужно слишком сильно), идентификаторы каждого значения в вашей связанной таблице должны быть равны целым значениям соответствующего элемента перечисления - просто добавленная мера совместимости. – Jon

+0

Значения перечисления являются ** не ** целыми числами. – Neal

0

Да, создать таблицу ссылок первой,
установить stratname, как уникальный,
использовать автоматическое приращение ID

Ленивый решение для вставки link_table:

insert into link_table 
select distinct strat from table_name order by strat; 

Однако, я не уверен, используется все предопределенное перечисление.

Кроме того, не зная размер перечислимого элемента,
Я не могу предложить вам сделать ручную вставку.

Если вы посмотрите на перечисление ...

enum('...', '...', ...) <-- is just a comma separated value 

Итак, вот запрос, чтобы получить CSV: -

select column_type from information_schema.columns 
where schema_name="table_name" and column_name = "strat"; 

Вы можете комбинировать с языком программирования, чтобы сделать link_table вставки ,

И, наконец, запрос UPDATE не очень оптимизирован, вы можете переключиться на использование INNER JOIN.
Но я предполагаю, что это одноразовая работа, пусть будет так!

Смежные вопросы