Как скопировать данные из одной таблицы в другую с другой структурой

0

У меня есть таблица со структурой

CREATE TABLE 'old_reminder' (
  'id' int(11) NOT NULL AUTO_INCREMENT,
  'applicant_id' int(11) NOT NULL,
  'date' datetime NOT NULL,
  'type' enum('payment_15_min','payment_1_day','payment_3_day') NOT NULL DEFAULT 'payment_15_min',
  PRIMARY KEY ('id')
)

и я хочу перенести свои данные в другую таблицу со структурой

CREATE TABLE 'new_reminders' (
  'id' int(10) unsigned NOT NULL AUTO_INCREMENT,
  'user_id' int(11) DEFAULT NULL,
  'payment_reminder_1_count' int(11) DEFAULT NULL,
  'payment_reminder_1_date' datetime DEFAULT NULL,
  PRIMARY KEY ('id')
)

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

UPDATE reminders 
    INNER JOIN old_reminder AS 'old'
    ON user_id = old.applicant_id
    SET new_reminder_1_date = IF(old.type = 'payment_15_min' OR old.type = 'payment_1_day' OR old.type = 'payment_3_day', old.date, '2018-01-01 00:00:00'),
    payment_reminder_1_count = IF(old.type = 'payment_15_min' OR old.type = 'payment_1_day' OR old.type = 'payment_3_day',
    CASE
    WHEN old.type = 'payment_15_min' THEN 1
    WHEN old.type = 'payment_1_day' THEN payment_reminder_1_count + 1
    WHEN old.type = 'payment_3_day' THEN payment_reminder_1_count + 1 END, 0)
    WHERE applicant_id = 123;
  • 0
    Я предлагаю вам написать простой сценарий миграции с использованием php, python, perl (с чем бы вы ни были знакомы), вы можете выбрать нужные строки из старой таблицы и применить необходимые изменения к набору данных и сохранить их в новой таблице.
  • 0
    Я не думаю, что вы задали воспроизводимый / ответный вопрос здесь. Можете ли вы сделать его более минимальным?
Теги:
database-migration
insert-update

1 ответ

0

Если модель выглядит так

truncate table old_reminder;
insert into old_reminder (applicant_id,date,type) values (123,'2018-01-01','payment_15_min');
insert into old_reminder (applicant_id,date,type) values (123,'2018-01-02','payment_1_day');
truncate table new_reminders;
insert into new_reminders(user_id,payment_reminder_1_date) values (123,'2016-01-01');

Затем упрощенная версия вашего запроса

update new_reminders n join (select * from old_reminder order by applicant_id,'date') old on old.applicant_id = n.user_id
     SET 
     enumstr = old.type,
     payment_reminder_1_date = 
     case 
        when old.type in ('payment_15_min','payment_1_day','payment_3_day') then old.date
        else '2017-01-01'   
     end     
    WHERE applicant_id = 123;

Производит этот результат, который, я думаю, означает то, что вы подразумеваете под ним, обновляет только 1 строку

+----+---------+--------------------------+-------------------------+----------------+
| id | user_id | payment_reminder_1_count | payment_reminder_1_date | enumstr        |
+----+---------+--------------------------+-------------------------+----------------+
|  1 |     123 |                     NULL | 2018-01-01 00:00:00     | payment_15_min |
+----+---------+--------------------------+-------------------------+----------------+
1 row in set (0.00 sec)

Предложение where вычисляется последним в этом запросе и может свободно выбирать, какой из них требуется из набора результатов - в этом случае всегда первое.

если запрос изменен для тестового теста payment_reminder_1_date

update new_reminders n join (select * from old_reminder order by applicant_id,'date') old on old.applicant_id = n.user_id
     SET 
     enumstr = old.type,
     payment_reminder_1_date = 
     case 
        when old.type in ('payment_15_min','payment_1_day','payment_3_day') then old.date
        else '2017-01-01'   
     end     
    WHERE applicant_id = 123 and n.payment_reminder_1_date <> old.'date'

Тогда вы получите нечто большее, чем вы надеетесь

+----+---------+--------------------------+-------------------------+---------------+
| id | user_id | payment_reminder_1_count | payment_reminder_1_date | enumstr       |
+----+---------+--------------------------+-------------------------+---------------+
|  1 |     123 |                     NULL | 2018-01-02 00:00:00     | payment_1_day |
+----+---------+--------------------------+-------------------------+---------------+
1 row in set (0.00 sec)

Но я не думаю, что это на самом деле то, что вы ищете, и я бы предложил, чтобы курсор мог двигаться вперед.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню