2013-06-05 30 views
9

Pytam od tableONE i próbuję wstawić zestaw wyników do tableTWO. Może to powodować duplikowanie błędu klucza w tableTWO w czasie. Tak więc chcę ON DUPLICATE KEY UPDATE z nową ustaloną wartością z zestawu tabel tableONE zamiast zignorować go z ON DUPLICATE KEY UPDATE columnA = columnA.MySQL ON DUPLICATE KEY UPDATE podczas wstawiania zestawu wyników z zapytania

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`]; 

zwróci błąd mówiąc następujące

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

, więc alias nie działa. Użyj 'count (crime_id)'? –

+0

mówi "Niewłaściwe użycie funkcji grupy" –

Odpowiedz

19

Problem polega na tym, że w dwóch egzemplarzach klauzul kluczowych nie można używać żadnych funkcji grupowania (np COUNT. Jednak nie jest to łatwy sposób obejść . problem po prostu przypisać wynik COUNT(crime_id) wezwanie do zmiennej, którą może zastosowanie w dwóch egzemplarzach klauzul kluczowych Twój INSERT będzie wtedy wyglądać tak:.

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; 

muszę utworzyć SQL Fiddle, który pokazuje, jak to działa: SQL-Fiddle


Można również użyć UPDATE crimecount = VALUES(crimecount) i nie zmienne:

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); 

Zobacz SQL-Fiddle-2

+0

PERFECT :) .... Jednak w SQL Fiddle, myślę, że zapomniałeś dodać 'date',' city' AS PRIMARY KEY ... 'ALTER TABLE' simple_crimecount' DODAJ PIERWSZY KLUCZ ('date',' city'); 'w przeciwnym razie nie znajdzie żadnego KLUCZA DUPLIKATU ... Edytuję twoją odpowiedź z aktualizacją SQLfiddle .... dzięki człowieku :) –

+0

Nie ma za co! * Nie * zapomniałem dodać klucza głównego, możesz edytować mój post. –

+2

Możesz także użyć 'NA DUPLICATE KEY UPDATE crimecount = VALUES (crimecount)'. Zobacz ** [Fiddle-2] (http://sqlfiddle.com/#!2/a814e/1) ** –