使用这个问题的答案:需要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;
Run Code Online (Sandbox Code Playgroud)
我需要这个与group by一起工作并加入..所以编辑:
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;
Run Code Online (Sandbox Code Playgroud)
我似乎无法更新值.如果我指定old_table.value,我得到一个未定义的字段列表错误.
根据http://dev.mysql.com/doc/refman/5.0/en/insert-select.html上的文档
在ON DUPLICATE KEY UPDATE的值部分中,只要不在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;
Run Code Online (Sandbox Code Playgroud)
在搜索更多内容时,我发现了一个相关的问题:“ MySQL ON DUPLICATE KEY UPDATE with nullable column in unique key ”。
答案是VALUES()
可以用于在选择子查询中引用列“值”。