2013-06-05 10 views
9

sto eseguendo la query da tableONE e cercando di inserire il set di risultati in tableTWO. Ciò può causare un errore chiave duplicato in tableTWO a volte. Quindi voglio ON DUPLICATE KEY UPDATE con il NUOVO valore determinato dal risultato di una tabellaONE invece di ignorarlo con ON DUPLICATE KEY UPDATE columnA = columnA.MySQL ON DUPLICATE KEY UPDATE mentre l'inserimento di un set di risultati di una query

INSERT INTO `simple_crimecount` (`date` , `city` , `crimecount`)(
    SELECT 
     `date`, 
     `city`, 
     count(`crime_id`) AS `determined_crimecount` 
    FROM `big_log_of_crimes` 
    GROUP BY `date`, `city` 
) ON DUPLICATE KEY UPDATE `crimecount` = `determined_crimecount`; 
# instead of [ON DUPLICATE KEY UPDATE `crimecount` = `crimecount`]; 

restituisce un errore dicendo che il seguente

Unknown column 'determined_crimecount' in 'field list' 
+1

quindi l'alias non funziona. Usa 'count (crime_id)'? –

+0

dice 'utilizzo non valido di gruppo function' –

risposta

19

Il problema è che nelle clausole chiave duplicati non è possibile utilizzare tutte le funzioni di raggruppamento (come COUNT. Tuttavia, c'è un modo semplice intorno a questo È sufficiente assegnare il risultato della chiamata COUNT(crime_id) a una variabile, che è possibile utilizzare nelle clausole chiave duplicate. L'istruzione di inserimento sarebbe quindi simile a questa:

INSERT INTO `simple_crimecount` (`date` , `city` , `crimecount`)(
    SELECT 
     `date`, 
     `city`, 
     @determined_crimecount := count(`crime_id`) AS `determined_crimecount` 
    FROM `big_log_of_crimes` 
    GROUP BY `date`, `city` 
) ON DUPLICATE KEY UPDATE `crimecount` = @determined_crimecount; 

devo creare un Fiddle SQL che mostra come funziona: SQL-Fiddle


Si potrebbe anche usare UPDATE crimecount = VALUES(crimecount) e nessuna variabile:

INSERT INTO `simple_crimecount` (`date` , `city` , `crimecount`)(
    SELECT 
     `date`, 
     `city`, 
     count(`crime_id`) AS `determined_crimecount` 
    FROM `big_log_of_crimes` 
    GROUP BY `date`, `city` 
) ON DUPLICATE KEY UPDATE `crimecount` = VALUES(crimecount); 

Vedere la SQL-Fiddle-2

+0

PERFETTO :) .... Tuttavia, in SQL Fiddle, penso che si è dimenticato di aggiungere' date', 'city' come chiave primaria ...' 'ALTER TABLE simple_crimecount' AGGIUNTA CHIAVE PRIMARIA ('date',' city'); 'altrimenti, non sta trovando alcun DUPLICATE KEY a tutti ... Sto modificando la risposta con l'aggiornamento SQLfiddle .... grazie man :) –

+0

Prego! Ho * dimenticato * di aggiungere la chiave primaria, sentiti libero di modificare il mio post. –

+2

Puoi anche usare 'ON DUPLICATE KEY UPDATE crimecount = VALUES (crimecount)'. Vedi il ** [Fiddle-2] (http://sqlfiddle.com/#!2/a814e/1) ** –

Problemi correlati