6

使用这个问题的答案:需要 MySQL INSERT - SELECT 查询具有数百万条记录的表

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 我得到一个未定义的字段列表错误。

4

2 回答 2

10

根据http://dev.mysql.com/doc/refman/5.0/en/insert-select.html上的文档

在 ON DUPLICATE KEY UPDATE 的 values 部分,你可以引用其他表中的列,只要你不在 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;
于 2011-08-25T11:37:02.057 回答
5

在搜索更多内容时,我发现了一个相关问题:“ MySQL ON DUPLICATE KEY UPDATE with nullable column in unique key ”。

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

于 2010-05-02T22:03:20.557 回答