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

SQL-opdatering ved dubletnøgleopdatering

Først og fremmest er den primære nøgle med flere kolonner sandsynligvis en dårlig idé; som du har fundet ud af, gør det det svært at manipulere de enkelte felter. Hvad du burde gøre er at tilføje en autoincrement bigint-kolonne til den tabel, som bliver din nye primære nøgle, og din tre-kolonne unikke begrænsning kan være et unikt indeks i stedet for. Det burde fungere bedre... men det vil også give dig mulighed for at udføre den slags manipulation, du har brug for. Det giver dig mulighed for at udføre ændringer, men stadig lader dig identificere de originale rækker ved deres heltalsindeks.

Hvis du gør det, kan din "engangsopdatering" nu udføres sikkert, så længe du ikke har noget imod at lave nogle midlertidige tabeller at arbejde med. Noget som dette:

Opret et par midlertidige tabeller med det samme skema, men uden det unikke tre-kolonne indeks - du kan have et ikke-unik indeks, fordi det vil hjælpe de forespørgsler, du er ved at udføre;

Kopier de poster, du skal behandle til den første tabel (inklusive den unikke heltals primærnøgle);

Opdater alle detail kolonner, du skal opdatere i den midlertidige tabel;

Brug INSERT ... SELECT med SUM og GROUP BY at flette disse poster ind i den anden tabel;

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

Til sidst skal du slette alle posterne i temp1-tabellen fra den originale tabel (ved at bruge heltals primærnøglen), og indsætte posterne i temp2-tabellen i den originale tabel.



  1. Hvordan kan jeg få en komplet liste over alle forespørgsler, der i øjeblikket kører på min MySQL-server?

  2. MySQL:Forespørgsel efter liste over tilgængelige muligheder for SET

  3. Hvordan tjekker man Tablespace i Oracle SQL Developer?

  4. Hvordan skriver man en SQL-forespørgsel, der tæller antallet af rækker pr. måned og år?