Как использовать UPDATE в инструкции INSERT SELECT - PullRequest
1 голос
/ 24 апреля 2019

Я хочу вставить записи из таблицы2 в таблицу1.Мне нужно заменить записи, если найден дубликат в первичном ключе.Первичный ключ вида string.

Итак, мое утверждение выглядит так (name - это первичный ключ, и это string. Повторяющиеся строки могут возникать из table2, который я хочу обновить):

INSERT INTO `myscheme1`.`table1`
(`table1`.`name`,
    `table1`.`id`,
    `table1`.`history`)

SELECT `table2`.`name`,
    `table2`.`id`,
    `table2`.`history`
FROM `myscheme2`.`table2`;

Куда добавить UPDATE?Если я не могу использовать UPDATE, не могли бы вы уточнить, как использовать ON DUPLICATE KEY UPDATE?

Потому что я не понимаю, как это применить?Я не знаю новую строку первичного ключа, которую я должен обновить старый (она читается командой, и у меня много повторяющихся случаев).Итак, этот пример : ниже предполагает, что я знаю, какое новое значение я должен ввести, если произойдет дублирование.

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

INSERT INTO 
   devices(name) 
VALUES 
   ('Printer') 
ON DUPLICATE KEY UPDATE name = 'Printer';

Подскажите, пожалуйста, как мне изменить синтаксис моей команды, если я хочу использовать UPDATE или ON DUPLICATE KEY UPDATE?

1 Ответ

1 голос
/ 24 апреля 2019

Вы используете ON DUPLICATE KEY UPDATE одинаково, независимо от того, приходят ли новые значения из SELECT или VALUES.

INSERT INTO `myscheme1`.`table1`
(`table1`.`name`, `table1`.`id`,  `table1`.`history`)
SELECT `table2`.`name`, `table2`.`id`, `table2`.`history`
FROM `myscheme2`.`table2`
ON DUPLICATE KEY UPDATE id = VALUES(id), history = VALUES(history);

Если table1 имеет то же имя, что и строка в table2остальные столбцы будут скопированы в эту строку.

Вам не нужно включать столбец name в ON DUPLICATE KEY.Он уже имеет значение из другой таблицы, так как именно это делает его дубликатом.

...