Auto-Inkrement wird in MySQL nicht zurückgesetzt

8

Ich versuche, ein Skript zu erstellen, um eine bestimmte Menge von Testdaten in meine Datenbank zu schreiben. Zu Beginn möchte ich die betreffenden Tabellen löschen, ohne Einschränkungen fallen zu lassen (weil die Testdaten nicht der richtige Ort sind) Construction Constraints) und setzen Sie AUTO_INCREMENT für jede Tabelle zurück, da das Einrichten der Testdaten sehr viel einfacher ist, wenn ich viele der IDs fest codieren kann.

Zum Beispiel habe ich zwei Anweisungen wie diese (es gibt ein Paar für fast jeden Tisch):

%Vor%

und während die Datensätze gelöscht werden, wird der Autoinkrementwert nicht auf 1 zurückgesetzt, obwohl alle gefundenen Dokumentations- und SO-Antworten anzeigen, dass dies funktionieren sollte.

Wenn ich dieselbe Anweisung in MySQL Workbench mache, wird sie auch nicht zurückgesetzt.

Dies ist in einer INNODB-Datenbank.

Was vermisse ich?

(Hinweis: Ich kann TRUNCATE nicht verwenden, weil Einschränkungen vorliegen).

    
Lawrence Dol 17.07.2013, 01:41
quelle

8 Antworten

12

MySQL erlaubt Ihnen nicht, den AUTO_INCREMENT-Wert wie hier angegeben zu verringern: Ссылка

  

Sie können den Zähler nicht auf einen Wert zurücksetzen, der kleiner oder gleich dem aktuell verwendeten Wert ist. Wenn der Wert für InnoDB und MyISAM kleiner oder gleich dem Maximalwert ist, der sich derzeit in der Spalte AUTO_INCREMENT befindet, wird der Wert auf den aktuellen Wert der maximalen AUTO_INCREMENT-Spalte plus eins zurückgesetzt.

Auch bei Ihren Einschränkungen würde ich eine der folgenden Möglichkeiten ausprobieren:

  1. Fügen Sie explizit Ihre Identitäten für Ihre Testdaten ein. Im Gegensatz zu einigen anderen Datenbank-Engines
  2. hat MySQL damit keine Probleme
  3. Löschen Sie Ihre Identitätsspalte und erstellen Sie sie neu (oder ändern Sie sie einfach als Identität), wenn die Einschränkungen nicht auf ihr selbst beruhen.
  4. Verwenden Sie keine Identity-Spalte und verwenden Sie eine andere Methode (z. B. eine Prozedur oder einen externen Code), um Ihre Identität zu steuern. Dies ist wirklich ein letzter Ausweg und ich würde es nicht allgemein empfehlen ...

Anmerkung von OP: Es war (1) das war was ich brauchte.

    
Mark Ormston 17.07.2013, 01:58
quelle
9

Was ich über die alter table-Anweisung sehen kann.

Sie können den Autoinkrementwert mithilfe der ALTER TABLE-Anweisung zurücksetzen. Die Syntax der ALTER TABLE-Anweisung zum Zurücksetzen des Autoinkrementwerts lautet wie folgt:

%Vor%

Sie geben den Tabellennamen nach der ALTER TABLE-Klausel und den Wert, auf den wir zurücksetzen möchten, im Ausdruck AUTO_INCREMENT = value an.

Beachten Sie, dass der Wert größer oder gleich dem aktuellen Maximalwert der Spalte für automatische Erhöhung sein muss.

Wo liegt Ihr Problem, vermute ich? Also im Grunde sind Sie mit ein paar Optionen wie folgt übrig:

  1. TRUNCATE TABLE: was laut unserer Diskussion keine Option ist
  2. TROPFEN und den Tisch ERHOLEN: Eine lange und schmerzvolle Erfahrung
  3. ALTER auto number column: Ich habe das nicht versucht, aber Sie könnten theoretisch die Primärschlüsselspalte von der Auto-Nummer zu einem int ändern und dann wieder eine Auto-Nummer machen. Etwas wie:

    %Vor%

Hoffen Sie, dass diese ein wenig helfen.

    
Namphibian 17.07.2013 01:57
quelle
4

Können Sie die entsprechende Spalte für die automatische Erhöhung nicht löschen und neu erstellen? ? Beispiel folgt:

%Vor%

Dieses sollte funktionieren, aber ich verwende kein MySQL, sondern entferne nur die Dokumente. Wenn Sie weitere Hilfe benötigen, hinterlassen Sie einen Kommentar und ich werde mein Bestes tun, um Ihnen zu helfen.

    
hd1 17.07.2013 02:02
quelle
1

Ich habe auf dieses Problem gestoßen, als ich die mittleren Zeilen aus meiner Tabelle gelöscht habe. Meine Antwort wäre, NEUE DATEN IN NICHT VORHANDENE ID EINZUFÜGEN. Ich erwarte, dass meine Antwort immer noch nützlich ist, auch wenn es PHP nicht MYSQL ist.

  1. Laden Sie zuerst Ihre Daten herunter.
  2. wenn keine vorhandene Zeile gefunden wurde Werte einfügen und beenden;
  3. sonst, wenn nicht in der ganzen Schleife gefunden, dann Einfügen für den Standardwert;

    %Vor%

Ich hoffe, es wird irgendwie helfen.

    
Luke359 19.05.2015 16:47
quelle
0

In nicht problematischen Situationen können Sie

tun %Vor%

was auto_increment value auf den niedrigsten erlaubten Zeitpunkt bringt.

    
Suspended 13.02.2016 22:43
quelle
0

ALTER TABLE tbl DROP COLUMN id;
ALTER TABLE tbl ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id);
in deinem phpMyAdmin     
King of approximate 27.07.2016 07:09
quelle
0

ALTER TABLE table_name AUTO_INCREMENT = value;
Das funktionierte für mich, ich musste es auf den letzten Datensatz in meiner Datenbank setzen, während das Operationsfeld nie für mich funktionierte.

    
dennis 21.07.2017 09:58
quelle
0

Ich bin mir sicher, dass dies lange beantwortet wurde, aber wenn ich abschneiden muss, kann ich nicht einfach ein set foreign_key_checks = 0 machen, dann starte mein truncate und dann set foreign_key_checks = 1 .

    
caro 01.08.2017 17:29
quelle

Tags und Links