Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mise à jour SQL sur la mise à jour de clé en double

Tout d'abord, cette clé primaire multi-colonnes est probablement une mauvaise idée; comme vous l'avez découvert, il est difficile de manipuler les champs individuels. Ce que vous devez faire est d'ajouter une colonne bigint à incrémentation automatique à cette table, qui deviendra votre nouvelle clé primaire, et votre contrainte d'unicité à trois colonnes peut être un index unique à la place. Cela devrait mieux fonctionner... mais cela vous permettra également de faire le type de manipulation dont vous avez besoin. Il vous permettra d'effectuer des modifications tout en vous permettant d'identifier les lignes d'origine par leur index entier.

Si vous faites cela, votre "mise à jour unique" peut maintenant être effectuée en toute sécurité, tant que cela ne vous dérange pas de créer des tables temporaires avec lesquelles travailler. Quelque chose comme ça :

Créez quelques tables temporaires avec le même schéma, mais sans l'unique index à trois colonnes - vous pouvez avoir un index non unique, car cela facilitera les requêtes que vous êtes sur le point d'effectuer ;

Copiez les enregistrements que vous devez traiter dans la première table (y compris la clé primaire entière unique) ;

Mettre à jour tous les detail colonnes que vous devez mettre à jour dans la table temporaire ;

Utilisez INSERT ... SELECT avec SUM et GROUP BY pour fusionner ces enregistrements dans la seconde table ;

INSERT INTO temp2 (...whatever...) SELECT ...whatever..., SUM(no) FROM temp1 GROUP BY ...whatever...

Enfin, supprimez tous les enregistrements de la table temp1 de la table d'origine (à l'aide de la clé primaire entière) et insérez les enregistrements de la table temp2 dans la table d'origine.