从查询中插入结果集时,MySQL ON DUPLICATE KEY UPDATE

Rak*_*kib 11 mysql resultset duplicates insert-update

我从tableONE查询并尝试将结果集插入tableTWO.这有时会导致tableTWO中出现重复键错误.所以我想ON DUPLICATE KEY UPDATE使用tableONE结果集中的新确定值,而不是忽略它ON DUPLICATE KEY UPDATE 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`];
Run Code Online (Sandbox Code Playgroud)

它返回一个错误说明如下

Unknown column 'determined_crimecount' in 'field list'
Run Code Online (Sandbox Code Playgroud)

Eri*_*oom 22

问题是在重复键子句中你不能使用任何分组函数(例如COUNT.但是,有一个简单的方法可以解决这个问题.你只需将COUNT(crime_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;
Run Code Online (Sandbox Code Playgroud)

我创建了一个SQL小提琴,向您展示它是如何工作的:SQL-Fiddle


你也可以使用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);
Run Code Online (Sandbox Code Playgroud)

请参阅SQL-Fiddle-2

  • 你也可以使用`ON DUPLICATE KEY UPDATE crimecount = VALUES(crimecount)`.参见**[小提琴2](http://sqlfiddle.com/#!2/a814e/1)** (2认同)