Массовое обновление MySQL новой таблицы на основе результатов другой таблицы - PullRequest
0 голосов
/ 10 октября 2019

У меня довольно сложная структура базы данных с более чем 1 миллионом записей. Я пытаюсь перенести данные из существующего объекта в новый объект.

Структура старой таблицы данных (которую я переношу) выглядит следующим образом:

MAIN / EXISTING TABLE

|-------|-----------|-----------|
| title | text      | parent_id |
|-------------------|-----------|
| HELLO | Something | 3001      |
|-------|-----------|-----------|
| HELLO | Hi!       | 3002      |
|-------|-----------|-----------|
| TEST  | World!    | 3001      |
|-------|-----------|-----------|

В ней более 1 миллиона записей.

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

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?

Ответы [ 2 ]

1 голос
/ 10 октября 2019
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)

Я думаю, вы можете работать с этим

1 голос
/ 10 октября 2019

Вы можете попробовать ниже -

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...