Po pierwsze, ten wielokolumnowy klucz podstawowy jest prawdopodobnie złym pomysłem; jak już się przekonałeś, utrudnia to manipulowanie poszczególnymi polami. To, co powinieneś zrobić, to dodać do tej tabeli kolumnę bigint autoincrement, która stanie się Twoim nowym kluczem podstawowym, a Twoje trzykolumnowe ograniczenie unikatowości może być zamiast tego unikalnym indeksem. Powinna działać lepiej... ale pozwoli ci również na manipulację, której potrzebujesz. Umożliwi to wykonanie modyfikacji, ale nadal pozwoli zidentyfikować oryginalne wiersze na podstawie ich indeksu całkowitego.
Jeśli to zrobisz, „jednorazową aktualizację” można teraz bezpiecznie wykonać, o ile nie masz nic przeciwko tworzeniu tabel tymczasowych do pracy. Coś takiego:
Utwórz kilka tabel tymczasowych z tym samym schematem, ale bez unikalnego indeks trzykolumnowy - możesz mieć nieunikalny indeks, ponieważ pomoże on w zapytaniach, które zamierzasz wykonać;
Skopiuj rekordy, które chcesz przetworzyć, do pierwszej tabeli (w tym unikalny klucz podstawowy liczby całkowitej);
Zaktualizuj wszystkie detail
kolumny, które musisz zaktualizować w tabeli tymczasowej;
Użyj INSERT ... SELECT
z SUM
i GROUP BY
scalić te rekordy w drugiej tabeli;
INSERT INTO temp2 (...whatever...) SELECT ...whatever..., SUM(no) FROM temp1 GROUP BY ...whatever...
Na koniec usuń wszystkie rekordy z tabeli temp1 z oryginalnej tabeli (używając klucza podstawowego liczby całkowitej) i wstaw rekordy z tabeli temp2 do oryginalnej tabeli.