我有一个具有以下结构的现有表
+-------------+-------+-------+-------+
| 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/