2010-05-02 28 views
5

Sử dụng câu trả lời từ câu hỏi này: Need MySQL INSERT - SELECT query for tables with millions of recordsMysql trên bản cập nhật khóa trùng lặp + truy vấn phụ

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; 

tôi cần điều này để làm việc với một nhóm bằng và tham gia .. vậy để chỉnh sửa:

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; 

Tôi dường như không thể cập nhật giá trị. Nếu tôi chỉ định old_table.value tôi nhận được một lỗi không được xác định trong danh sách trường.

Trả lời

3

Trong khi tìm kiếm xung quanh một số khác, tôi đã tìm thấy câu hỏi có liên quan: "MySQL ON DUPLICATE KEY UPDATE with nullable column in unique key".

Câu trả lời là VALUES() có thể được sử dụng để tham khảo cột "giá trị" trong truy vấn con được chọn.

+0

chính xác, đó là vấn đề – newtover

+1

VALUES() không hoạt động trên phiên bản mysql (5.1.32) của tôi. Tôi đã phải sử dụng mẹo trong câu trả lời của tôi dưới đây. Tôi chắc chắn muốn VALUES() sẽ hoạt động - nó thanh lịch hơn nhiều. – Justin

6

mỗi tài liệu tại http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

Trong các giá trị một phần của ON DUPLICATE CẬP NHẬT KEY, bạn có thể tham khảo các cột trong bảng khác, miễn là bạn không sử dụng GROUP BY trong phần SELECT. Một tác dụng phụ là bạn phải hội đủ điều kiện các tên cột không phải trong phần giá trị.

Vì vậy, bạn không thể sử dụng truy vấn chọn vì nó có nhóm theo câu lệnh. Bạn cần phải sử dụng thủ thuật này để thay thế. Về cơ bản, điều này tạo ra một bảng có nguồn gốc để bạn truy vấn từ đó. Nó có thể không cực kỳ hiệu quả, nhưng nó hoạt động.

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

Cảm ơn Justin. Bạn đã lưu ẩn của chúng tôi trên [đây] (http://stackoverflow.com/q/38050762) – Drew

Các vấn đề liên quan