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 区别