不在查询中插入并更新差异

时间:2009-11-19 00:09:14

标签: mysql

如果我有两个表,如下所示,第一个显示原始数据,第二个表显示原始数据的压缩版本:

raw_table:

val
1
1
2
2
2
3
3
4

comp_table:

val       count
1         2
2         3
3         2
4         1

我想将raw_data压缩到另一个表

INSERT INTO comp_table VALUES (
    SELECT val, COUNT(val) FROM raw_table 
    WHERE val NOT IN(
        SELECT val FROM comp_data
    ) GROUP BY val
)

第一个问题: 上面的语法是否正确?

第二个问题: 计数已更新,进行更新的最有效查询是什么?

注意:数据大小超过raw_table

中的百万条记录

提前致谢:D

2 个答案:

答案 0 :(得分:1)

该查询可能会有效,但这是ON DUPLICATE KEY UPDATE的一个很好的用例:

INSERT INTO comp_table (val, val_count)
SELECT
    val, 1
FROM comp_data
ON DUPLICATE KEY UPDATE val_count = val_count + 1;

第一次运行插入查询时,它将插入值并将计数设置为1.在此之后插入相同的值时,计数将递增。

注意:要使其正常工作,您必须在comp_table中的val列上拥有唯一键。

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

答案 1 :(得分:0)

从我从Bradym那里得到的信息:归功于他

INSERT INTO comp_data
  SELECT val, COUNT(val) FROM raw_data GROUP BY val
ON DUPLICATE KEY
  UPDATE
    count = (SELECT COUNT(val) FROM raw_data WHERE raw_data.val = comp_data.val)

尝试和测试:D