SQL Index neu generieren

Überkinger

Lieutenant
Registriert
Juli 2010
Beiträge
600
Hallo,

ich habe eine Tabelle mit Feldern. Ein Feld lautet 'number', auf den auch der Index zeigt.

Ursprünglich waren, sagen wir 1000 Einträge (Kunden) vorhanden. Einige Kunden wurden gelöscht, so dass es effektiv nur noch 950 Einträge gibt. Wenn sich jetzt ein Kunde anmeldet, erhält er die number 1001. Wie kann ich den Index zurücksetzen, so dass der Index auf die vorhandenen Einträge gesetzt wird?
 
Normalerweise: Gar nicht. Aufgrund der referentiellen Integrität ist es nicht erwünscht, dass sich der Primary Key irgendwann ändert. Insbesondere wenn du ein Datenbank-Format ohne Foreign Keys hast kann es sonst zu gravierenden Störungen in der Datenstruktur kommen.

Tatsächlich: Bei MyISAM kann man den Auto-Increment - Wert direkt manipulieren. Bei InnoDB resettet er automatisch auf den tiefsten freien Wert, sobald die Datenbank neu gestartet wird.
 
Das ist nicht gewünscht und sollte auch unterlassen werden. Wenn du eine Datenbank Struktur hast, in der mit der Kundennummer noch andere Dinge verknüpft werden, ist es sehr ungesund die nachträglich zu verändern.

Warum willst du unbedingt das die Nummern zurück gesetzt werden?
 
Wie gesagt: Es mag weder gewünscht noch sinnvoll sein. InnoDB macht es trotzdem, sobald der MySQL-Dienst neu startet. Hat mir bei einige Experimenten mit Magento schon geholfen, um fehlgeleitete Bestellungen restlos aus dem System zu tilgen.

Oh, und was garantiert wirkt: Ein TRUNCATE table; Hat zwar noch ne andere Wirkung, aber würde zumindest den Auto Increment garantiert resetten.
 
Warum um alles in der Welt willst du dieses Verhalten ändern? Nutzt du die ID für irgendeinen Zweckentfremdenden Sinn?

Wenn ein Händler soetwas in seiner Kundendatenbank machen würde - Kunde wird gelöscht, Kundennummer wird wieder frei, anderer Kunde bekommt die dann - und Jahre später gibts Streitigkeiten um eine Rechnung des alten Kunden, was zu einer Mahnung an den neuen Kunden (hey, das ist halt diese Kundennummer gewesen!). Wäre das nicht etwas... unprofessionell?

Ich kann mir gerade keinen Grund ausdenken, weshalb du das auto_increment nun anpassen willst - abgesehen von einem verirrten Gefühl der Unordnung wenn da nun 'freie' Zahlen zu sehen sind und es in der Tabellenübersicht nunmal etwas schöner ausschauen würde mit durchgehenden Zahlen.
 
Wie gesagt, es macht Sinn wenn man Spuren verwischen will... z.B. eben Test-Bestellungen in einem Shop-System. Ansonsten macht es einfach keinen Sinn, auch wenn es tatsächlich durch oben genannte Eigenheit von InnoDB tatsächlich passieren kann.
 
Daaron schrieb:
Wie gesagt, es macht Sinn wenn man Spuren verwischen will... z.B. eben Test-Bestellungen in einem Shop-System. Ansonsten macht es einfach keinen Sinn, auch wenn es tatsächlich durch oben genannte Eigenheit von InnoDB tatsächlich passieren kann.

Das ist der Grund. Ich habe einige Testuser, deren Bestellungen im Produktivsystem wieder entfernt werden sollen. Allerdings wird der ID Zähler stets hochgesetzt. Ich habe bisher immer mit myscldump > und mysql < einfach kurz ein Backup und Restore der Tabelle gemacht.
 
ich hab grad irgendwie das pw meiner lokalen mysql-installation verloren (gut. hab ich morgen was zu tun) und kann im phpmyadmin nicht nachgucken, wie genau die funktion heißt... bin mir aber sicher, dass man den Auto_Increment - Wert für MyISAM über phpMA setzen kann.
Oder du stellst die Tabellen auf InnoDB um, ist eh performanter. Man sollte immer InnoDB nutzen, außer man braucht FULLTEXT-Indizes. Die gibts NOCH nicht für InnoDB. Da reicht es wie gesagt, die letzten Einträge zu löschen und den MySQL-Dienst neu zu starten.

Was du NIE kannst (oder solltest): den AI auf einen Wert setzen, der kleiner als der aktuell größte verwendete Wert ist. Du wirst in deinen Indizes irgendwann immer Lücken haben. Das ist ganz normal.


Edit: Passwort für phpMA is mir wieder eingefallen...
Wen du eine Tabelle angewählt hast: unter "Operationen" kannst du den AI-Wert ändern.
 
Zuletzt bearbeitet:
@Überkinger: Das ist eigenlich auch noch kein Grund. Ob deine 5000te Bestellung nun die Nummer 5009 hat oder wirklich die 5000 ist vollkommen irrelevant.
 
och, ich hab in einem Shop inzwischen Artikel-ID 4xxx, obwohls "nur" 2600 Artikel oder so sind. Es nervt mich schon etwas, aber hier lässt sich gar nix mehr machen.
 
Zurück
Oben