2010-05-02 9 views
5

Utilizzando la risposta da questa domanda: Need MySQL INSERT - SELECT query for tables with millions of recordsMysql sul duplicato aggiornamento tasto + domanda secondaria

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; 

ho bisogno di questo per lavorare con un gruppo e unirsi .. così da modificare:

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; 

Non riesco a ottenere il valore aggiornato. Se si specifica old_table.value, viene visualizzato un errore non definito nell'elenco dei campi.

risposta

3

Durante la ricerca in giro, ho trovato una domanda correlata: "MySQL ON DUPLICATE KEY UPDATE with nullable column in unique key".

La risposta è che VALUES() può essere utilizzato per fare riferimento alla colonna "valore" nella sottosquadro di selezione.

+0

esattamente, questo è il problema – newtover

+1

VALUES() non funziona sulla mia versione mysql (5.1.32). Ho dovuto usare il trucco nella mia risposta qui sotto. Certo che vorrei che VALUES() funzionasse, è molto più elegante. – Justin

6

Per i documenti a http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

Nella parte valori di ON DUPLICATE KEY UPDATE, è possibile fare riferimento alle colonne in altre tabelle, fino a quando non si utilizza GROUP BY nella parte SELECT. Un effetto collaterale è che è necessario qualificare nomi di colonne non univoci nella parte dei valori.

Quindi, non è possibile utilizzare la query di selezione perché ha un gruppo per istruzione. Hai bisogno di usare questo trucco, invece. Fondamentalmente, questo crea una tabella derivata da cui eseguire una query. Potrebbe non essere incredibilmente efficiente, ma funziona.

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

Grazie Justin. Hai salvato la nostra pelle su [here] (http://stackoverflow.com/q/38050762) – Drew