【问题标题】:Add "on duplicate key update" clause to insert into query添加“重复键更新”子句以插入查询
【发布时间】:2014-02-17 02:00:41
【问题描述】:

我从这样的查询开始:

insert into summary ( col1, col2, Total ) 
select col1, col2, count(col4) as total from importdata 
where col1 = 'abc' and col4 in ('1A', '2A') 
group by col1, col2
order by col1, col2

而且我无法确定正确的“重复”子句。我认为我需要的子句是

on duplicate key update total=count(col4)

我把它放在查询的最后一行和 where 子句之后的行,但两者都产生了错误。我的条款甚至正确吗?它需要去哪里?

(最坏的情况我可以使用“插入忽略”,但我认为进行更新会更好。)

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您不能在ON DUPLICATE KEY UPDATE 子句中使用COUNT 或其他组函数。你可以这样做:

    INSERT INTO summary ( col1, col2, Total ) 
        SELECT col1, col2, count(col4)
        FROM importdata 
        WHERE col1 = 'abc' AND col4 IN ('1A', '2A') 
        GROUP BY col1, col2
        ORDER BY col1, col2
    ON DUPLICATE KEY UPDATE Total = VALUES(Total)
    

    这表示,如果存在重复键,而不是插入新行,只需将列 total 设置为您将在 Total 中插入的值。请注意,我删除了 as total - 这会导致问题,因为您已经有一个名为 Total 的列,并且名称不区分大小写。

    【讨论】:

      【解决方案2】:

      您不能使用函数来更新重复键,但是,您可以创建一个变量,然后使用该变量。

      INSERT INTO summary (col1, col2, Total)
         select col1, col2,  @totalCount := count(col4) as Total from importdata 
         where col1 = 'abc' and col4 in ('1A', '2A') 
         group by col1, col2
         order by col1, col2
      ) ON DUPLICATE KEY UPDATE Total = @totalCount;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 2012-04-21
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多