Първо, този първичен ключ с няколко колони вероятно е лоша идея; както разбрахте, това затруднява манипулирането на отделните полета. Това, което трябва да направите, е да добавите колона с автоинкремент bigint към тази таблица, която ще стане вашият нов първичен ключ, а вашето ограничение за уникалност от три колони може да бъде уникален индекс. Би трябвало да работи по-добре... но също така ще ви позволи да правите и манипулацията, от която се нуждаете. Това ще ви позволи да извършвате модификации, но все пак ви позволява да идентифицирате оригиналните редове по техния целочислен индекс.
Ако направите това, вашата "еднократна актуализация" вече може да бъде извършена безопасно, стига да нямате нищо против да създадете някои временни таблици, с които да работите. Нещо като това:
Създайте няколко временни таблици със същата схема, но без уникалното индекс с три колони – можете да имате неуникален индекс, защото той ще помогне на заявките, които предстои да изпълните;
Копирайте записите, които трябва да обработите, в първата таблица (включително уникалния целочислен първичен ключ);
Актуализирайте всички detail
колони, които трябва да актуализирате във временната таблица;
Използвайте INSERT ... SELECT
с SUM
и GROUP BY
за да обедините тези записи във втората таблица;
INSERT INTO temp2 (...whatever...) SELECT ...whatever..., SUM(no) FROM temp1 GROUP BY ...whatever...
Накрая изтрийте всички записи в таблицата temp1 от оригиналната таблица (използвайки целочисления първичен ключ) и вмъкнете записите в таблицата temp2 в оригиналната таблица.