MySQL在插入查询结果集时进行重复密钥更新

MySQL在插入查询结果集时进行重复密钥更新,mysql,resultset,insert-update,duplicates,Mysql,Resultset,Insert Update,Duplicates,我正在从表1查询,并试图将结果集插入表2中。这可能会导致tableTWO中出现重复的键错误。因此,我希望使用tableONE结果集中新确定的值来重复密钥更新,而不是使用重复密钥更新columnA=columnA忽略它 INSERT INTO `simple_crimecount` (`date` , `city` , `crimecount`)( SELECT `date`, `city`, count(`crime_id`) AS `

我正在从表1查询,并试图将结果集插入表2中。这可能会导致tableTWO中出现重复的键错误。因此,我希望使用tableONE结果集中新确定的值来
重复密钥更新,而不是使用
重复密钥更新columnA=columnA
忽略它

INSERT INTO `simple_crimecount` (`date` , `city` , `crimecount`)(
    SELECT 
        `date`, 
        `city`,
        count(`crime_id`) AS `determined_crimecount`
    FROM `big_log_of_crimes`
    GROUP BY `date`, `city`
) ON DUPLICATE KEY UPDATE `crimecount` = `determined_crimecount`;
# instead of [ON DUPLICATE KEY UPDATE `crimecount` = `crimecount`];
它返回一个错误,说明以下内容

Unknown column 'determined_crimecount' in 'field list'

问题是,在重复键子句中,您不能使用任何分组函数(例如
COUNT
。但是,有一种简单的方法可以解决此问题。您只需分配
COUNT(crime\u id)的结果即可
调用变量,您可以在重复键子句中使用该变量。然后,您的insert语句如下所示:

INSERT INTO `simple_crimecount` (`date` , `city` , `crimecount`)(
    SELECT 
        `date`, 
        `city`,
        @determined_crimecount := count(`crime_id`) AS `determined_crimecount`
    FROM `big_log_of_crimes`
    GROUP BY `date`, `city`
) ON DUPLICATE KEY UPDATE `crimecount` = @determined_crimecount;
我已经创建了一个SQL小提琴,向您展示了它的工作原理:


您还可以使用
UPDATE crimecount=VALUES(crimecount)
且无变量:

INSERT INTO `simple_crimecount` (`date` , `city` , `crimecount`)(
    SELECT 
        `date`, 
        `city`,
        count(`crime_id`) AS `determined_crimecount`
    FROM `big_log_of_crimes`
    GROUP BY `date`, `city`
) ON DUPLICATE KEY UPDATE `crimecount` = VALUES(crimecount);

请参阅

以使别名不起作用。使用
计数(犯罪_id)
?表示组函数的
无效使用
完美:)。。。。但是,在SQL FIDLE中,我认为您忘记添加
日期
城市
作为主键
ALTER TABLE
simple_crimecount`添加主键(
date
city
);`否则,它根本找不到任何重复的密钥。。。我正在用更新SQLfiddle编辑您的答案。。。。谢谢男人:)不客气!我忘记添加主键了,请随意编辑我的帖子。您也可以在重复键上使用
更新crimecount=VALUES(crimecount)
。请参阅hey@ypercube,谢谢您的更新。。。。您的更新值得作为单独的答案发布。。。。根据MySQL开发者文档,我认为fiddle2是在重复键上出现
的情况下进行更新的更推荐的方法-当使用第一种方法在select语句中设置变量时(
@determined\u crimecount:=count(crime\u id)
)我在MySQL 8.0.16中得到以下警告:
1287在表达式中设置用户变量已被弃用,将在将来的版本中删除。考虑备选方案:“设置变量=表达式,…”,或“选择表达式(s)到变量(s)”/代码>,为此,在更新中使用第二种方法使用<代码>值(CurreCuNt)< /C>。这工作正常,我安全地避免了弃用警告+谢谢你的回答。