INSERISCI IN … SELEZIONA DA … SU DUPLICATO AGGIORNAMENTO CHIAVE

Sto facendo una query di inserimento in cui la maggior parte di molte colonne dovrebbe essere aggiornata ai nuovi valori se esiste già una chiave univoca. Va qualcosa del genere:

INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, inact, inadur, inadist, smlct, smldur, smldist, larct, lardur, lardist, emptyct, emptydur) SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, t.inact, t.inadur, t.inadist, t.smlct, t.smldur, t.smldist, t.larct, t.lardur, t.lardist, t.emptyct, t.emptydur FROM tmp t WHERE uid=x ON DUPLICATE KEY UPDATE ...; //update all fields to values from SELECT, // except for exp_id, created_by, location, animal, // starttime, endtime 

Non sono sicuro di quale dovrebbe essere la syntax per la clausola UPDATE . Come faccio a fare riferimento alla riga corrente dalla clausola SELECT ?

MySQL assumerà la parte prima che gli equals faccia riferimento alle colonne denominate nella clausola INSERT INTO e la seconda parte faccia riferimento alle colonne SELECT.

 INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, inact, inadur, inadist, smlct, smldur, smldist, larct, lardur, lardist, emptyct, emptydur) SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, t.inact, t.inadur, t.inadist, t.smlct, t.smldur, t.smldist, t.larct, t.lardur, t.lardist, t.emptyct, t.emptydur FROM tmp t WHERE uid=x ON DUPLICATE KEY UPDATE entct=t.entct, inact=t.inact, ... 

Anche se sono molto in ritardo a questo, ma dopo aver visto alcune domande legittime per coloro che volevano utilizzare la query INSERT-SELECT con la clausola GROUP BY , ho trovato il modo di ovviare a questo problema.

Prendendo ulteriormente la risposta di Marcus Adams e della contabilità GROUP BY , ecco come risolverei il problema usando le Subqueries in the FROM Clause

 INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, inact, inadur, inadist, smlct, smldur, smldist, larct, lardur, lardist, emptyct, emptydur) SELECT sb.id, uid, sb.location, sb.animal, sb.starttime, sb.endtime, sb.entct, sb.inact, sb.inadur, sb.inadist, sb.smlct, sb.smldur, sb.smldist, sb.larct, sb.lardur, sb.lardist, sb.emptyct, sb.emptydur FROM (SELECT id, uid, location, animal, starttime, endtime, entct, inact, inadur, inadist, smlct, smldur, smldist, larct, lardur, lardist, emptyct, emptydur FROM tmp WHERE uid=x GROUP BY location) as sb ON DUPLICATE KEY UPDATE entct=sb.entct, inact=sb.inact, ...