MySQL 使用嵌套查询插入或更新

Posted

技术标签:

【中文标题】MySQL 使用嵌套查询插入或更新【英文标题】:MySQL insert or update with nested query 【发布时间】:2020-09-07 18:46:04 【问题描述】:

我有一个查询需要在表中插入值并在键已存在时更新它们。

此请求如下:

INSERT INTO table1(`id`, `day`, `quantity`, `residue`)
      SELECT
          id,
          SUBDATE(NOW(), 1) as day,
          (
             A SUB QUERY 
          ) as qte,
          (
             ANOTHER SUB QUERY
          ) as r
FROM table2
ON DUPLICATE KEY UPDATE 
  quantity=qte, 
  residue=r;

此请求导致错误Unknown column 'qte' in 'field list' 我错过了什么?

【问题讨论】:

【参考方案1】:

你想要VALUES():

ON DUPLICATE KEY UPDATE 
    quantity = VALUES(quantity), 
    residue = VALUES(residue)

它的工作原理是explained in the documentation:

ON DUPLICATE KEY UPDATE 子句中的赋值表达式中,您可以使用VALUES(col_name) 函数来引用INSERT 部分中的列值。

【讨论】:

如果我理解正确,VALUES(column) 指的是现有值而不是选择中的新值,因此我将只保留相同的值而不是使用新值进行更新。跨度> @Xiidref:它指的是“新”值。进一步在文档中:换句话说,ON DUPLICATE KEY UPDATE 子句中的 VALUES(col_name) 是指将插入的 col_name 的值,没有发生重复键冲突。 是的,在仔细检查之后,我很抱歉造成误解,感谢您的回答,它现在就像一个魅力! 在新版本的 mysql(我认为是 8.0.19?)中不推荐使用 VALUES 的这种非标准使用,并且会发出警告。在那里,您应该在列列表和 SELECT 之间添加别名 AS newdata 或类似名称,并在重复子句中说 =newdata.columnname

以上是关于MySQL 使用嵌套查询插入或更新的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的多表联查和嵌套查询

Mysql:有没有更高效的嵌套聚合更新方式?

如果值不存在,将值插入 MySQL 表?

Java学习总结(十六)——MySQL数据库(中)分组,嵌套,连接查询及外键与关系表设计

这个查询不好吗? MySql 一对多与左连接和嵌套查询

mysql_数据查询_嵌套查询