我有一个相当复杂的数据库结构,有超过一百万条记录。我正在尝试将数据从现有实体迁移到新实体。
我正在迁移的旧数据表的结构如下:
MAIN / EXISTING TABLE
|-------|-----------|-----------|
| title | text | parent_id |
|-------------------|-----------|
| HELLO | Something | 3001 |
|-------|-----------|-----------|
| HELLO | Hi! | 3002 |
|-------|-----------|-----------|
| TEST | World! | 3001 |
|-------|-----------|-----------|
它有超过一百万条记录。
作为迁移目标的新表具有来自现有表的标题属性作为列名。
NEW TABLE
|---|-----------|-------|------|-------|
|id | parent_id | HELLO | TEST | OTHER |
|---|-----------|-------|------|-------|
| x | 3001 | NULL | NULL | NULL |
|---|-----------|-------|------|-------|
| y | 3002 | NULL | NULL | NULL |
|---|-----------|-------|------|-------|
| z | 3003 | NULL | NULL | NULL |
|---|-----------|-------|------|-------|
基于现有数据的新表的预期结果如下:
DESIRED NEW TABLE
|---|-----------|-----------|--------|-------|
|id | parent_id | HELLO | TEST | OTHER |
|---|-----------|-----------|--------|-------|
| x | 3001 | Something | World! | NULL |
|---|-----------|-----------|--------|-------|
| y | 3002 | Hi! | NULL | NULL |
|---|-----------|-----------|--------|-------|
| z | 3003 | NULL | NULL | NULL |
|---|-----------|-----------|--------|-------|
可以像这样(伪代码)以编程方式实现结果:
FOREACH row IN `MAIN TABLE`:
UPDATE `NEW TABLE` SET `row.title` = 'row.text'
但这不是可行的解决方案,因为有太多记录要循环。
有人知道该解决方案是否可以在MySQL中使用吗?
答案 0 :(得分:1)
您可以在下面尝试-
UPDATE NEWTABLE INNER JOIN
(
select max(case when title='HELLO' then text end) as hello,
max(case when title='TEST' then text end) as test,
max(case when title not in ('HELLO','TEST') then text end) as other
from MAINTABLE group by parent_id
)A ON NEWTABLE.parent_id= A.parent_id
SET HELLO= A.hello,TEST=A.test,OTHER= A.other
答案 1 :(得分:1)
update newtab
join maintab on maintab.parent_id=newtab.parent_id set
newtab.HELLO=if(maintab.title='HELLO',maintab.text,newtab.HELLO)
,newtab.TEST=if(maintab.title='TEST',maintab.text,newtab.TEST)
,newtab.OTHER=if(maintab.title='OTHER',maintab.text,newtab.OTHER)
我认为您可以与此配合