Em primeiro lugar, essa chave primária de várias colunas é provavelmente uma má ideia; como você descobriu, fica difícil manipular os campos individuais. O que você deve fazer é adicionar uma coluna bigint de autoincremento a essa tabela, que se tornará sua nova chave primária, e sua restrição de exclusividade de três colunas pode ser um índice exclusivo. Deve ter um desempenho melhor... mas também permitirá que você faça o tipo de manipulação que você precisa. Ele permite que você faça modificações, mas ainda permite identificar as linhas originais por seu índice inteiro.
Se você fizer isso, sua "atualização única" agora pode ser feita com segurança, desde que você não se importe em criar algumas tabelas temporárias para trabalhar. Algo assim:
Crie algumas tabelas temporárias com o mesmo esquema, mas sem o exclusivo índice de três colunas - você pode ter um índice não exclusivo, pois ajudará nas consultas que você está prestes a realizar;
Copie os registros que você precisa processar na primeira tabela (incluindo a chave primária inteira exclusiva);
Atualize todos os
detail
colunas que você precisa atualizar na tabela temporária; Use
INSERT ... SELECT
com SUM
e GROUP BY
para mesclar esses registros na segunda tabela; INSERT INTO temp2 (...whatever...) SELECT ...whatever..., SUM(no) FROM temp1 GROUP BY ...whatever...
Por fim, exclua todos os registros da tabela temp1 da tabela original (usando a chave primária inteira) e insira os registros da tabela temp2 na tabela original.