MySQL在插入查询结果集时进行重复密钥更新
我正在从表1查询,并试图将结果集插入表2中。这可能会导致tableTWO中出现重复的键错误。因此,我希望使用tableONE结果集中新确定的值来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 `
重复密钥更新,而不是使用重复密钥更新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>。这工作正常,我安全地避免了弃用警告+谢谢你的回答。