Mysql
 sql >> Database >  >> RDS >> Mysql

Aggiornamento SQL su aggiornamento chiave duplicata

Per prima cosa, quella chiave primaria a più colonne è probabilmente una cattiva idea; come hai scoperto, rende difficile manipolare i singoli campi. Quello che dovresti fare è aggiungere una colonna bigint di incremento automatico a quella tabella, che diventerà la tua nuova chiave primaria e il tuo vincolo di unicità a tre colonne può invece essere un indice univoco. Dovrebbe funzionare meglio... ma ti permetterà anche di fare il tipo di manipolazione di cui hai bisogno. Ti consentirà di eseguire modifiche ma ti consentirà comunque di identificare le righe originali in base al loro indice intero.

Se lo fai, il tuo "aggiornamento una tantum" ora può essere eseguito in sicurezza, a condizione che non ti dispiaccia creare alcune tabelle temporanee con cui lavorare. Qualcosa del genere:

Crea un paio di tabelle temporanee con lo stesso schema, ma senza l'unico indice a tre colonne:puoi avere un indice non univoco, perché aiuterà le query che stai per eseguire;

Copia i record che devi elaborare nella prima tabella (inclusa la chiave primaria intera univoca);

Aggiorna tutti i detail colonne che devi aggiornare nella tabella temporanea;

Usa INSERT ... SELECT con SUM e GROUP BY per unire quei record nella seconda tabella;

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

Infine, elimina tutti i record nella tabella temp1 dalla tabella originale (utilizzando la chiave primaria intera) e inserisci i record nella tabella temp2 nella tabella originale.