首页 > 解决方案 > 如何在 INSERT SELECT 语句中使用 UPDATE

问题描述

我想将 table2 中的记录插入 table1。如果发现主键重复,我需要替换记录。类型的主键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';

如果我想使用UPDATEor ,你能告诉我如何编辑我的命令语法ON DUPLICATE KEY UPDATE吗?

标签: mysqldatabasemysql-workbench

解决方案


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. 它已经具有另一个表中的值,因为这就是使它重复的原因。


推荐阅读