6

この質問からの回答を使用: MySQL INSERT - SELECT query for tables with millions records

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;

group by で作業して join.. を編集するには、これが必要です。

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 の値の部分では、SELECT 部分で GROUP BY を使用しない限り、他のテーブルの列を参照できます。副作用の 1 つは、値の部分で一意でない列名を修飾する必要があることです。

そのため、group by ステートメントがあるため、select クエリを使用することはできません。代わりにこのトリックを使用する必要があります。基本的に、これにより、クエリを実行するための派生テーブルが作成されます。信じられないほど効率的ではないかもしれませんが、うまくいきます。

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 columninuniquekey」。

答えはVALUES()、selectサブクエリの列「value」を参照するために使用できるということです。

于 2010-05-02T22:03:20.557 に答える