2010-05-02 100 views
5

从这个问题使用了答案:Need MySQL INSERT - SELECT query for tables with millions of recordsMySQL在重复键更新+子查询

new_table 
    * date 
    * record_id (pk) 
    * data_field 


INSERT INTO new_table (date,record_id,data_field) 
    SELECT date, record_id, data_field FROM old_table 
     ON DUPLICATE KEY UPDATE date=old_table.data, data_field=old_table.data_field; 

我需要这与一组工作,并加入..所以编辑:

INSERT INTO new_table (date,record_id,data_field,value) 
    SELECT date, record_id, data_field, SUM(other_table.value) as value FROM old_table JOIN other_table USING(record_id) GROUP BY record_id 
     ON DUPLICATE KEY UPDATE date=old_table.data, data_field=old_table.data_field, value = value; 

我似乎无法获得更新的价值。如果我指定old_table.value,我得到一个未定义的字段列表错误。

回答

3

在寻找更多的时候,我发现一个相关的问题:“MySQL ON DUPLICATE KEY UPDATE with nullable column in unique key”。

答案是VALUES()可以用来引用select子查询中的列“value”。

+0

确切地说,那就是问题 – newtover 2010-05-02 22:21:25

+1

VALUES()在我的mysql版本(5.1.32)上不起作用。我不得不在下面的答案中使用这个技巧。我确实希望VALUES()能够工作 - 它更加优雅。 – Justin 2011-08-25 11:41:46

6

%的文档在http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

在对重复密钥更新的价值的一部分,你可以参考列在其他表,只要你不要在SELECT部分​​使用GROUP BY。一个副作用是您必须限定值部分中的非唯一列名。

所以,你不能使用select查询,因为它有一个group by语句。你需要使用这个技巧。基本上,这会创建一个派生表供您查询。它可能不是非常有效,但它的工作原理。

INSERT INTO new_table (date,record_id,data_field,value) 
    SELECT date, record_id, data_field, value 
    FROM (
     SELECT date, record_id, data_field, SUM(other_table.value) as value 
     FROM old_table 
     JOIN other_table 
     USING(record_id) 
     GROUP BY record_id 
    ) real_query 
ON DUPLICATE KEY 
    UPDATE date=real_query.date, data_field=real_query.data_field, value = real_query.value; 
+0

谢谢贾斯汀。你在[这里](http://stackoverflow.com/q/38050762) – Drew 2016-06-28 03:51:15