我有一个具有以下结构的现有表

+-------------+-------+-------+-------+
| employee_id | val_1 | val_2 | val_3 | ...
+-------------+-------+-------+-------+
|         123 |     A |     B |     C |

我想将这个表更改为两个表-一个表包含单独行中的值,另一个表将成为这个表的联接表。例如,将上述内容转换为:
+-------------+--------+      +----+-------+
| employee_id | val_id |      | id | value |
+-------------+--------+      +----+-------+
|         123 |      1 |      |  1 |     A |
+-------------+--------+      +----+-------+
|         123 |      2 |      |  2 |     B |
+-------------+--------+      +----+-------+
|         123 |      3 |      |  3 |     C |
+-------------+--------+      +----+-------+

将现有表转换成这2个新表的最佳SQL是什么?我可以很容易地创建values表,但是我不知道如何同时创建join表。

最佳答案

类似的内容(仅限psuedo代码,抱歉):

For each row in (SELECT employee_id, val_1, val_2, val_3 FROM existing_table)
{
   for each val in (row.Values)
   {
     INSERT INTO new_values (val)
     val_id = SELECT LAST_INSERT_ID();
     INSERT INTO new_employees (employee_id, val_id);
  }
}

可能有一种基于集合的方法来避免循环。。。但是很抱歉,我不知道你是什么样的人,我不知道如何将values表的标识返回到parent employee表中。
而且,虽然cursors通常不受欢迎,但这种一次性操作正是它们的设计目的(即我不建议将游标用于常规事务或报表处理,而是用于数据的重新结构。。。。为什么不呢?).

关于mysql - MySQL:使用连接表将行拆分为多行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14018391/

10-10 13:12