Ich habe eine MySQL-Tabelle mit einem Auto-Inkrement-Primärschlüssel. Ich habe einige Zeilen in der Mitte der Tabelle gelöscht. Jetzt habe ich zum Beispiel so etwas in der ID-Spalte: 12, 13, 14, 19, 20. Ich habe die Zeilen 15, 16, 17 und 18 gelöscht.
Ich möchte den Primärschlüssel neu zuweisen / zurücksetzen / neu anordnen, damit ich Kontinuität habe, dh die 19 a 15, die 20 a 16 und so weiter.
Wie kann ich es tun?
Auch wenn diese Frage ziemlich alt zu sein scheint, wird eine Antwort für jemanden posten, der hier auf der Suche greift.
Wenn die Spalte in anderen Tabellen als Fremdschlüssel verwendet wird, stellen Sie sicher, dass Sie
ON UPDATE CASCADE
anstelle der StandardeinstellungON UPDATE NO ACTION
für die Fremdschlüsselbeziehung in diesen Tabellen verwenden.Um die
AUTO_INCREMENT
Anzahl zurückzusetzen, können Sie außerdem sofort die folgende Anweisung ausgeben.Bei MySQLs wird der Wert auf zurückgesetzt
MAX(id) + 1
.quelle
.
id` = @count: = @count + 1` in einer vordefinierten Reihenfolge erfolgen. Aus der Dokumentation: "Der Wert auf der rechten Seite kann ein Literalwert, eine andere Variable, die einen Wert speichert, oder ein beliebiger rechtlicher Ausdruck sein, der einen skalaren Wert ergibt"Um die IDs meiner Benutzertabelle zurückzusetzen, verwende ich die folgende SQL-Abfrage. Es wurde oben gesagt, dass dies alle Beziehungen ruinieren wird, die Sie möglicherweise mit anderen Tabellen haben.
quelle
Sie können diese Abfrage einfach verwenden
quelle
Ich denke, das wird es tun
quelle
Oder entfernen Sie in PhpMyAdmin das Flag "AutoIncrement", speichern Sie es, setzen Sie es erneut und speichern Sie es. Dadurch wird es zurückgesetzt.
quelle
Wenn du möchtest
order by
quelle
in phpmyadmin
Gehen Sie zu Ihrer Tabelle -> klicken Sie auf das Operationsmenü -> Gehen Sie zu Tabellenoptionen -> ändern Sie AUTO_INCREMENT in das Nein, von wo aus Sie beginnen möchten.
Ihre Tischautoinkrementierung beginnt mit dieser Nr.
Versuch es.
quelle
Sie können die automatische Inkrementierungsfunktion des Primärschlüssels dieser Spalte entfernen. Führen Sie dann jedes Mal, wenn Sie diese Spalte aktualisieren, eine Abfrage aus, die alle Zeilen in der Tabelle zählt, und führen Sie dann eine Schleife aus, die diese Zeilenanzahl durchläuft und jeden Wert in die Spalte einfügt Führen Sie schließlich eine Abfrage aus, in der eine neue Zeile eingefügt wird, wobei der Wert dieser Spalte die Gesamtzahl der Zeilen plus eins ist. Dies funktioniert einwandfrei und ist die absoluteste Lösung für jemanden, der versucht, das zu erreichen, was Sie sind. Hier ist ein Beispiel für Code, den Sie für die Funktion verwenden können:
Hier habe ich ein assoziatives Array erstellt, das ich an eine Rangspalte mit der Abfrage innerhalb einer ausgewählten Abfrage angehängt habe, wodurch jeder Zeile ein Rangwert zugewiesen wurde, der mit 1 beginnt. Anschließend habe ich das assoziative Array durchlaufen.
Eine andere Option wäre gewesen, die Zeilenanzahl abzurufen, eine grundlegende Auswahlabfrage auszuführen, das assoziative Array abzurufen und es auf dieselbe Weise zu iterieren, jedoch mit einer hinzugefügten Variablen, die bei jeder Iteration aktualisiert wird. Dies ist weniger flexibel, erreicht aber das Gleiche.
quelle
Führen Sie für InnoDB dies aus (dies entfernt alle Datensätze aus einer Tabelle, machen Sie zuerst einen Bakcup):
quelle
Ich hatte die gleichen Zweifel, konnte aber keine Änderungen an der Tabelle vornehmen. Nachdem ich festgestellt hatte, dass meine ID die in der Variablen @count festgelegte maximale Anzahl nicht überschritt, entschied ich mich für Folgendes:
Die Lösung dauert, aber es ist sicher und es war notwendig, weil meine Tabelle Fremdschlüssel mit Daten in einer anderen Tabelle besaß.
quelle
Am besten ändern Sie die Spalte und entfernen das Attribut auto_increment. Geben Sie dann eine weitere alter-Anweisung aus und setzen Sie auto_increment wieder in die Spalte. Dadurch wird die Anzahl auf das Maximum + 1 der aktuellen Zeilen zurückgesetzt, und Fremdschlüsselverweise auf diese Tabelle, aus anderen Tabellen in Ihrer Datenbank oder andere Schlüsselverwendungen für diese Spalte bleiben erhalten.
quelle
Meine Meinung ist, eine neue Spalte namens row_order zu erstellen. Ordnen Sie dann diese Spalte neu an. Ich akzeptiere die Änderungen am Primärschlüssel nicht. Wenn die Auftragsspalte beispielsweise banner_position lautet, habe ich Folgendes ausgeführt: Dies dient zum Löschen, Aktualisieren und Erstellen einer Bannerpositionsspalte. Rufen Sie diese Funktion auf, um sie jeweils neu zu ordnen.
quelle
Dies funktioniert - https://stackoverflow.com/a/5437720/10219008.....but, wenn Sie auf das Problem 'Fehlercode: 1265 "stoßen. Daten für Spalte' id 'in Zeile 1 abgeschnitten' ... Führen Sie dann aus folgende. Hinzufügen von Ignorieren für die Update-Abfrage.
quelle
Sie können auch einfach vermeiden, numerische IDs als Primärschlüssel zu verwenden. Sie können Ländercodes als primäre ID verwenden, wenn die Tabelle Länderinformationen enthält, oder Sie können Permalinks verwenden, wenn sie beispielsweise Artikel enthält.
Sie können auch einfach einen zufälligen oder einen MD5-Wert verwenden. Alle diese Optionen haben ihre eigenen Vorteile, insbesondere im IT-Bereich. numerische IDs sind einfach aufzuzählen.
quelle