Переход от перечисления к связанной таблице - PullRequest
0 голосов
/ 15 декабря 2011

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

Как бы мы поступили об этом?

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

Я думал, что-то вроде:

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

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

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

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

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

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

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

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

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

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

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.
Но я предполагаю, что это разовая работа, пусть будет так!

0 голосов
/ 15 декабря 2011

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

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

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

...