2010-03-18 16 views
95

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. E 'più o meno così:INSERISCI IN ... SELEZIONA DA ... ON DUPLICATE AGGIORNAMENTO CHIAVE

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 quello che la sintassi per la clausola UPDATE dovrebbe essere. Come faccio a fare riferimento alla riga corrente dalla clausola SELECT?

risposta

125

MySQL assume la parte prima che gli uguali faccia riferimento alle colonne denominate nella clausola INSERT INTO e la seconda parte fa 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, ... 
+5

@dnagirl: ** TIP: ** non cercare di aggiorna le colonne PK, solo quelle che necessitano di aggiornamento vanno nella lista – lexu

+37

La tua sintassi suggerita funziona e il 't' è richiesto. Ho anche trovato un articolo su xaprb (http://www.xaprb.com/blog/2006/02/21/flexible-insert-and-update-in-mysql/) che utilizza questa sintassi: 'su aggiornamento chiave duplicato b = valori (b), c = valori (c) '. Anche questo funziona. – dnagirl

+7

Nota: questo non funzionerà quando l'istruzione SELECT ha una clausola GROUP BY – joHN

28

Anche se sono molto tardi per questo, ma dopo aver visto alcune domande legittime per coloro che volevano usare INSERT-SELECT query con GROUP BY clausola, mi si avvicinò con il lavoro in giro per questo.

Prendendo ulteriormente la risposta del Marcus Adams e contabilità GROUP BY in essa, questo è come vorrei risolvere il problema utilizzando 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, ... 
+6

Questa è la risposta giusta per le query con COUNT, GROUP ecc. Grazie. – Kostanos

+0

Grazie mille, amico! Mi è piaciuto molto questo approccio, specialmente perché mi consente di creare un meccanismo come Continuous Query, qualcosa che fa InfluxDB. – Miere

+0

Felice di sentirlo – iConfused

Problemi correlati