Объедините два столбца вместе из отдельных таблиц - PullRequest
3 голосов
/ 20 июля 2010

Скажем, например:

  • У меня есть две таблицы: old_data и new_data .

  • Оба old_data и new_data имеют один столбец с именем this_is_col .

  • Оба old_data и new_data имеют различные (сотни) строк дат (2010-02-06, 2010-01-09, 2007-06-02 и т. Д.).Обе таблицы не обязательно имеют одинаковые даты, но они имеют одинаковый формат.

  • Поля обеих таблиц - это различные целые числа.


Моя задача:

  • Скопировать поля из old_data в new_data .

  • Если в обеих таблицах существует дата, поле в new_data будет заменено.

  • Если дата не существует в new_data , то будет добавлена ​​правильная строка и поле будет скопировано.


Вот как далеко я зашёл:

Создать временный столбец:

ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;

Копировать данные из old_data :

INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;

Объединить временный столбец и new_data . this_is_col .(Я на самом деле не понял этого шага, так как не дошел до этого).

MERGE? `tempColumn` `this_is_col`;

Удалить временную таблицу

ALTER TABLE `new_data` DROP `tempColumn`;

После выполнения второго действия (передача данных во временный столбец) Я получаю эту ошибку:

#1062 - Duplicate entry '0000-00-00' for key 1

И вот я застрял.Любая помощь будет оценена.Я использую MySQL и phpMyAdmin для проверки команд SQL.

Ответы [ 4 ]

3 голосов
/ 20 июля 2010

Если ваши даты проиндексированы как уникальные ключи:

INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...
0 голосов
/ 20 июля 2010

Если вы предпочитаете сначала удалить строку, а не обновлять: REPLACE

Это тоже будет всего одна строка, поэтому: REPLACE data SELECT, вы не получитесделать странность с добавлением текстового столбца.

0 голосов
/ 20 июля 2010

Как насчет просто сделать UPDATE и INSERT?

UPDATE new_data SET col=col 
FROM new_data a join old_data b on a.this_is_col = b.this_is_col

Тогда

INSERT INTO new_data (cols) SELECT cols 
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)

Если я не понял неправильно ...

0 голосов
/ 20 июля 2010

вы хотите INSERT ... ON DUPLICATE KEY UPDATE . Ваше решение уже удовлетворяет шагам 1 и 3 вашей задачи, ON DUPLICATE KEY UPDATE позаботится о шаге 2.

...