mysql - 如何在 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';
如果我想使用UPDATE
or ,你能告诉我如何编辑我的命令语法ON DUPLICATE KEY UPDATE
吗?
解决方案
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
. 它已经具有另一个表中的值,因为这就是使它重复的原因。
推荐阅读
- azure-devops - 使用多阶段的 Azure DevOps YAML 管道批准
- javascript - 使用带有页面对象模型的 cypress 实现
- python-3.x - 使用python抓取ajax xmlhttprequest
- angular - 将 Angular 从 v8 更新到 v9 并启用 ivy 为 true 后,组件在开始时未加载
- neo4j - 使用 LOAD CSV 创建具有特定内部 ID 的节点
- javascript - 我在检查器中看到一个空页面和此消息“此文件是一个模板,如果您直接在浏览器中打开它,您将看到一个空页面。”
- c# - 实体框架延迟加载不起作用(外键对象为空)
- python - Django Group权限如何在模板中打印
- html - HTML文件中的“#”字符是什么意思?
- asciidoc - asciidoctor-pdf 封面图像大小以填充页面