Ich habe eine ziemlich große Datenbank, die ich für die Verfolgung von Artikeln in einem Haus von unseren Service-Reps verwendet. Für eine programmatische Einfachheit habe ich die Tracking-Seite so geschrieben, dass jedes Mal, wenn jemand ein neues installiertes Objekt aktualisiert, entfernt oder hinzufügt, es die Liste der installierten Objekte vollständig löscht und von Grund auf neu erstellt.MySQL Primärschlüsselbereinigung
Dies funktioniert sehr gut und war im tatsächlichen Gebrauch fehlerfrei, aber jetzt bin ich in ein anderes Problem gekommen, dass ich ein bisschen besorgt bin. Der Primärschlüssel, der verwendet wird, um jeden einzelnen Gegenstand in der Wohnung zu verfolgen, ist exponentiell gewachsen, weil er für jedes Update alte Zahlen löscht und wieder von der höchsten auto_increment startet. Das heißt, ich habe große Lücken in meinen IDs und mein höchster Index ist Tausende von Zahlen höher als die tatsächliche Anzahl der installierten Maßnahmen.
Zur Verdeutlichung: Es ist mir egal, dass es Lücken in den IDs gibt, ich baute mein System nur diese Nummer als Fremdschlüssel Verweis auf die Rechnungsinformationen für es verwenden und es wird nie angezeigt. Meine eigentliche Sorge ist, dass mir die Zahlen weit, viel früher als möglich ausgehen werden.
Ich weiß, dass ich mein Skript ändern könnte, um "effizienter" zu sein und nicht Elemente zu löschen, die sich nicht ändern und ich könnte das in Zukunft tun (dieses Problem ist ein Symptom für den Zweck meines Trackings radikal ändern sich mitten in einem Projekt. Danke, Chef), aber in der Zwischenzeit würde ich gerne wissen, ob es einen Weg gibt, um meine IDs "aufzuräumen". Alles, was von diesen Zahlen abhängt, ist auf Kaskade eingestellt, so dass es kein Problem mit der Aktualisierung der Schlüssel geben sollte. Im Grunde möchte ich mit 1 beginnen, die Lücken zwischen den IDs beseitigen und Konflikte mit bestehenden IDs vermeiden, während das Skript läuft.
Ich hoffe, dass jemand ein einfaches Mittel zur Verfügung stellen kann, hoffentlich eines, das als gespeicherte Prozedur implementiert werden kann und routinemäßig ausgeführt werden kann.
Wie ich es verstehe, ändert die Änderung der 'AUTO_INCREMENT' nur den Wert der nächsten in die Tabelle eingefügten Zeile auf was auch immer Sie' AUTO_INCREMENT' einstellen, richtig? Es hat keine Auswirkungen auf zuvor eingegebene Zeilen? Ich möchte die Primärschlüsselwerte bereits eingegebener Zeilen bereinigen. –
Oh sorry, ich habe dich damals nicht verstanden ... Es gibt zwei Möglichkeiten: Schreibe ein Skript, das leere pk's erkennt oder wie ich geschrieben habe: benutze BIGINT. Ich denke, der BIGINT wäre eine gute Lösung. Ich glaube nicht, dass Sie bis zum Limit von 9.223.372.036.854.775.807 Stück pro Stück kommen würden ;-) –
Überraschenderweise würde ich bei der Rate, die ich durch die Ziffern verbrenne, wahrscheinlich würde. Ich muss wirklich nur die Seite aktualisieren, um nicht so verschwenderisch zu sein, aber es war einfach kein Problem in der ersten Reihe von Kriterien, die sie mir gegeben haben. Der nächste Schritt besteht also darin, es als gespeicherte Prozedur anstelle eines externen Skripts ausführen zu lassen, aber ich bin mir noch nicht sicher, wie ich das anstellen soll. Brauchen Sie ein Buch zu bekommen. –