Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL-Update bei doppelter Schlüsselaktualisierung

Das Wichtigste zuerst, dieser mehrspaltige Primärschlüssel ist wahrscheinlich eine schlechte Idee; wie Sie festgestellt haben, ist es schwierig, die einzelnen Felder zu manipulieren. Was Sie tun sollten, ist, dieser Tabelle eine autoincrement bigint-Spalte hinzuzufügen, die zu Ihrem neuen Primärschlüssel wird, und Ihre dreispaltige Eindeutigkeitsbeschränkung kann stattdessen ein eindeutiger Index sein. Es sollte besser funktionieren ... aber es wird Ihnen auch die Art von Manipulation ermöglichen, die Sie benötigen. Damit können Sie Änderungen vornehmen, aber dennoch die ursprünglichen Zeilen anhand ihres Integer-Index identifizieren.

Wenn Sie das tun, kann Ihr "einmaliges Update" jetzt sicher durchgeführt werden, solange es Ihnen nichts ausmacht, einige temporäre Tabellen zu erstellen, mit denen Sie arbeiten können. Etwa so:

Erstellen Sie ein paar temporäre Tabellen mit demselben Schema, aber ohne unique dreispaltiger Index - Sie können einen nicht-eindeutigen Index haben, da er bei den Abfragen, die Sie ausführen möchten, hilfreich ist;

Kopieren Sie die Datensätze, die Sie verarbeiten müssen, in die erste Tabelle (einschließlich des eindeutigen ganzzahligen Primärschlüssels);

Aktualisieren Sie alle detail Spalten, die Sie in der temporären Tabelle aktualisieren müssen;

Verwenden Sie INSERT ... SELECT mit SUM und GROUP BY um diese Datensätze in der zweiten Tabelle zusammenzuführen;

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

Löschen Sie schließlich alle Datensätze in der Tabelle temp1 aus der Originaltabelle (unter Verwendung des ganzzahligen Primärschlüssels) und fügen Sie die Datensätze in der Tabelle temp2 in die Originaltabelle ein.