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

时间:2013-06-05 09:11:17

标签: mysql resultset insert-update duplicates

我从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`];

它返回错误,说明以下

Unknown column 'determined_crimecount' in 'field list'

1 个答案:

答案 0 :(得分: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;

我创建了一个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);

请参阅 SQL-Fiddle-2