sql >> Database >  >> RDS >> Mysql

SQL-update bij dubbele sleutelupdate

Allereerst is die primaire sleutel met meerdere kolommen waarschijnlijk een slecht idee; zoals je hebt ontdekt, maakt het het moeilijk om de afzonderlijke velden te manipuleren. Wat u zou moeten doen, is een auto-increment bigint-kolom aan die tabel toevoegen, die uw nieuwe primaire sleutel wordt, en in plaats daarvan kan uw uniciteitsbeperking met drie kolommen een unieke index zijn. Het zou beter moeten presteren... maar het stelt je ook in staat om het soort manipulatie uit te voeren dat je nodig hebt. Hiermee kunt u wijzigingen aanbrengen, maar kunt u de originele rijen nog steeds identificeren aan de hand van hun integer-index.

Als je dat doet, kan je "eenmalige update" nu veilig worden gedaan, zolang je het niet erg vindt om wat tijdelijke tabellen te maken om mee te werken. Zoiets als dit:

Maak een paar tijdelijke tabellen met hetzelfde schema, maar zonder de unieke index met drie kolommen - u kunt een niet-unieke index hebben, omdat deze helpt bij de zoekopdrachten die u gaat uitvoeren;

Kopieer de records die u moet verwerken naar de eerste tabel (inclusief de unieke primaire sleutel van het gehele getal);

Werk alle detail bij kolommen die u moet bijwerken in de tijdelijke tabel;

Gebruik INSERT ... SELECT met SUM en GROUP BY om die records samen te voegen in de tweede tabel;

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

Verwijder ten slotte alle records in de temp1-tabel uit de oorspronkelijke tabel (met de primaire sleutel voor geheel getal) en voeg de records in de temp2-tabel in de oorspronkelijke tabel in.



  1. PHP + SQL Server - Hoe tekenset instellen voor verbinding?

  2. Hoe controleer ik of een tabel of kolom in een database bestaat?

  3. Php-tijdformaat

  4. Hoe helpt pgBouncer om Django te versnellen?