Zum Hauptinhalt springen
  1. Braindump/

Numerische Auto-Increment-ID durch eine andere Reihenfolge ersetzen

2 min
Marcel Ryser
Autor
Marcel Ryser
Softwarearchitekt und Tech-Enthusiast aus Bern

Das war eine ziemlich seltsame Anfrage. Eine Tabelle hatte Auto-Increment-IDs – bei MySQL ganz üblich.

Die Anfrage war dann aber, den Inhalt nach Datum neu zu sortieren und diese Reihenfolge in der ID-Spalte abzubilden.

Vorher:

ID Date
1 2017-01-04
2 2018-02-06
3 2016-12-24

Nachher:

ID Date
1 2016-12-24
2 2017-01-04
3 2018-02-06

Tabelle für die Reihenfolge vorbereiten
#

Füge der bestehenden Tabelle eine neue Spalte hinzu, die die sortierte Position aufnimmt.

alter table mytable add column orderid int

Neue ID generieren
#

Jetzt sortieren wir den Inhalt der Tabelle und speichern die Position im sortierten Ergebnis in der neuen Spalte. Im Beispiel sortieren wir nach Datum.

SET @rownum=0;
UPDATE mytable AS i, (SELECT @rownum:=@rownum+1 rownum, id FROM mytable order by mytable.date asc) AS r
SET i.orderid = r.rownum
WHERE i.id = r.id;

Alte ID durch die neue ersetzen
#

Nun bereiten wir die ID-Spalte auf die neue ID vor, indem wir die ID über den letzten Eintrag hinaus verschieben. Das ist nötig, weil MySQL zeilenweise aktualisiert und beim Überschreiben der ID mit der neuen orderID sonst ID-Kollisionen entstünden.

UPDATE mytable SET id = id+(select max(id) from mytable);

jetzt können wir die ID überschreiben mit

UPDATE mytable SET id = orderid;

nun bildet die ID die Reihenfolge nach Datum ab.

Aufräumen
#

Da wir die ID erfolgreich aktualisiert haben, können wir unsere Hilfsspalte orderid löschen

ALTER TABLE mytable DROP COLUMN orderid;

Mein Rat
#

Meiner Meinung nach ist das nicht wirklich, wie man eine Datenbank nutzen sollte – das klingt eher nach einer Anfrage von jemandem, der Excel gewohnt ist.