MySQL INSERT INTO / ON DUPLICATE KEY 与 SELECT 语句问题

Posted

技术标签:

【中文标题】MySQL INSERT INTO / ON DUPLICATE KEY 与 SELECT 语句问题【英文标题】:MySQL INSERT INTO / ON DUPLICATE KEY with SELECT statement issue 【发布时间】:2010-12-15 07:07:12 【问题描述】:

你好 - 我是 mysql 菜鸟。我有一个包含各种商业列表的表格,我正在尝试填充第二个名为城市的表格,其中包含唯一的城市名称以及每个城市的列表数量。我可以执行一个 SELECT 语句来获取这些数据,如下所示:

SELECT city,state,sum(count)
FROM (
SELECT city,state, 1 AS count FROM listings
) results
GROUP BY city
ORDER BY sum(count) DESC,city;

但是,现在我想更新表格,但我似乎无法获得正确的语句来工作。这是我拥有的最新版本,但我目前收到“无效使用组功能”错误。

INSERT INTO cities(city,state,size)
SELECT city,state,sum(count)
FROM (
SELECT city,state, 1 AS count FROM listings
) results
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), size=sum(count); 

感谢任何帮助!

【问题讨论】:

【参考方案1】:

像这样简单的东西会起作用吗?

insert into cities (city, state, size)
select city, state, count(*) as size from listings
group by city, state

group by 应该确保没有重复,这样就不需要on duplicate key。你正在做的 sum() + subquery 看起来你只是想做一个 count(*)。

您遇到的具体错误是由于 size=sum(count)。在批量插入中,执行此操作的正确方法是 size=values(size),请参阅values() 上的文档。

编辑:

如果它为每个城市添加另一个条目,那么城市上没有唯一索引,并且重复键无论如何都不会做任何事情。

如果您在 (city, state) 上添加唯一索引,则可以将 on duplicate key update size=values(size) 添加到上述查询中,它将更新每条记录。

【讨论】:

我想我们刚刚发布了相同的查询。 嗯,这可行,但它似乎是为每个重复的城市添加另一个条目,而不是更新前一个条目。我想这就是我通过声明的“ON DUPLICATE KEY UPDATE”部分得到的结果。 如果您先截断表格,则不需要 ON DUPLICATE KEY。但是如果你真的想要 UN DUPLICATE KEY(这不是一个坏方法),那么你需要在(城市,州)上有一个 PRIMARY 或 UNIQUE 键,而你可能没有。【参考方案2】:

试试这个,虽然我希望在向你释放它之前我有一些东西可以测试它。

insert into cities (city, state, size)
select city, state, count(*) AS size
from listings
group by city, state

【讨论】:

以上是关于MySQL INSERT INTO / ON DUPLICATE KEY 与 SELECT 语句问题的主要内容,如果未能解决你的问题,请参考以下文章

MySQL--INSERT INTO ... ON DUPLICATE KEY UPDATE ...

MySQL INSERT INTO / ON DUPLICATE KEY 与 SELECT 语句问题

mysql特殊语法insert into .. on duplicate key update ..使用详解

insert into ... on duplicate key update 与 replace 区别

oracle sql判断一个数大于2000 如果大于减1500

INSERT INTO .. ON DUPLICATE KEY更新多行记录