MySQL Auto_increment geht 2 mal 2

8

Ich habe neulich MySQL Workbench installiert, auf die Datenbank meines Unternehmens zugegriffen und mir eine Tabelle zum Arbeiten erstellt. So weit, ist es gut. Das Problem ist, ich habe festgestellt, dass mein auto_increment 2 um 2 erhöht. Zum Beispiel:

ID    NAME
1     Paul
3     Jack
5     Louis
7     John
...

Wenn ich das SHOW VARIABLES LIKE 'auto_inc%'bekomme, bekomme ich folgendes:

'auto_increment_increment', '2'
'auto_increment_offset', '1'

Also habe ich versucht auto_increment_increment, 1 zu setzen mit:

SET @@auto_increment_increment=1

Und nach erneuter Überprüfung mit SHOW VARIABLES LIKE 'auto_inc%'bestätigte ich, dass es mit dem Ergebnis "funktioniert" hat:

'auto_increment_increment', '1'
'auto_increment_offset', '1'

Aber meine IDs werden immer noch um 2 mal 2 erhöht .

Das erste Mal, als ich es tat, funktionierte es gut und dann schloss ich MySQL Workbench, um festzustellen, dass es beim erneuten Öffnen wieder auto_increment_incrementauf 2 gesetzt wurde. Jetzt versuche ich es noch einmal, aber es scheint nicht einmal mehr zu funktionieren.

Kann mir bitte jemand dabei helfen?

Danke Leute.

Bernardo Oliveira
quelle
2
Ich würde diesen Wert vorsichtig ändern, ohne vollständig zu verstehen, warum die Umgebung unseres Unternehmens dies festlegt. Diese Variable muss häufig geändert werden, wenn sie beispielsweise in einem Multi-Master-Replikationssetup ausgeführt wird. Können wir auch eine SHOW CREATE TABLE-Anweisung für die Tabelle erhalten, mit der Sie testen (das Testen der Produktion ist übrigens auch eine schlechte Idee)
Derek Downey
Dies verdient eine Antwort, denke ich. Oder um in ein vorhandenes hinzugefügt zu werden, was auch immer Sie bevorzugen. Die beste Maßnahme ist eine vorsichtige oder gar keine Maßnahme für Datenbankadministratoren, die ihren Arbeitsplatz behalten möchten.
Ypercubeᵀᴹ

Antworten:

7

Das verwendete Präfix:

SET @@auto_increment_increment=1;

Ist das gleiche wie:

SET @@SESSION.auto_increment_increment=1;

Wenn Sie diese Einstellung ändern, wird sie nur in Ihrer aktuellen Sitzung relevant.

Um eine dauerhaftere Lösung zu finden, versuchen Sie:

SET GLOBAL auto_increment_increment=1;

Ist das gleiche wie:

SET @@GLOBAL.auto_increment_increment=1;
Morgan Tocker
quelle
Huh, ich dachte @@ wäre das Sitzungsattribut. Aus dem MySQL-Handbuch: "Um explizit anzugeben, dass eine Variable eine Sitzungsvariable ist, stellen Sie vor ihrem Namen SESSION, @@ session. Oder @@" dev.mysql.com/doc/refman/5.1/en/set-option. html
Derek Downey
Hmm .. so ist es. Meine erste Antwort wiederherstellen.
Morgan Tocker
Hey Morgan, danke für die Antwort! Aber was ist, wenn ich kein SET GLOBAL machen will oder kann? Kann ich es nur für meine sehr spezifische Datenbank / Tabelle festlegen, ohne die Sitzungsvariablen verwenden zu müssen?
Bernardo Oliveira
Wenn Sie GLOBAL nicht einstellen können, führen Sie in jeder Sitzung, in der dieses Verhalten nicht gewünscht wird, SET auto_increment_increment = 1 aus.
Morgan Tocker
2

Beide Variablen haben globale und Sitzungswerte. Es ist also sehr wahrscheinlich, dass Sie nur den Wert der Sitzung geändert haben, der beim Schließen der MySQL Workbench nicht mehr vorhanden war.

Eine weitere Einschränkung, auf die Sie achten sollten, ist die folgende

Diese Variablen steuern das Verhalten aller AUTO_INCREMENT-Spalten in allen Tabellen auf dem MySQL-Server. Wenn der globale Wert einer der Variablen festgelegt ist, bleiben ihre Auswirkungen bestehen, bis der globale Wert durch Festlegen des Sitzungswerts geändert oder überschrieben wird oder bis mysqld neu gestartet wird. Wenn der lokale Wert festgelegt ist, wirkt sich der neue Wert auf die Spalten AUTO_INCREMENT für alle Tabellen aus, in die der aktuelle Benutzer für die Dauer der Sitzung neue Zeilen einfügt, sofern die Werte während dieser Sitzung nicht geändert werden.

Was Sie auch täuschen könnte, ist die Art und Weise, wie der nächste Autoincrement-Wert berechnet wird, wenn Sie die Inkrementgröße ändern. Es wird nicht der zuletzt gespeicherte Spaltenwert verwendet, sondern der nächsthöhere Wert mithilfe der Formel berechnet

auto_increment_offset + N × auto_increment_increment

während N eine ganze Zahl ist, so dass der neue Wert größer als der größte vorhandene ist.

Weitere Informationen zur Funktionsweise finden Sie in der Dokumentation zu auto_increment_increment .

MicSim
quelle
Das sind sehr nützliche Informationen. Danke MicSim! In der Tat habe ich nur den Sitzungswert geändert. Ich versuche herauszufinden, wie ich es dauerhaft ändern kann, aber nur für eine Datenbank oder Tabelle. Irgendwelche Ideen?
Bernardo Oliveira
Wie in der Dokumentation angegeben, ist es nicht möglich, die Datenbank oder die Tabelle festzulegen. Es tut mir leid, ich kann dir hier nicht helfen. Vielleicht versuchen Sie, mit der Autoincrement-Funktion etwas zu erreichen, für das sie nicht vorgesehen war.
MicSim