Mysql auto increment springt bei einfügen-wählen Sie
Ich die Prüfung insert-select-Abfrage und bemerkte ein komisches Ergebnis.
CREATE TABLE `test` (
`cnt` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL,
PRIMARY KEY (`cnt`)
)
CREATE TABLE `test_current` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
)
Ersten ich habe zwei Tabellen, und fügen Sie einige Werte in test_current
mysql> insert into test_current (a,b) values (1,1),(2,2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
Und ich habe diese Abfrage
mysql> INSERT INTO test (a,b) SELECT a,b FROM test_current;
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 1
mysql> select * from test;
+-----+------+------+
| cnt | a | b |
+-----+------+------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
+-----+------+------+
2 rows in set (0.00 sec)
Aber wenn ich die Abfrage wieder
mysql> INSERT INTO test (a,b) SELECT a,b FROM test_current;
Query OK, 2 rows affected, 1 warning (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 1
mysql> select * from test;
+-----+------+------+
| cnt | a | b |
+-----+------+------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 4 | 1 | 1 |
| 5 | 2 | 2 |
+-----+------+------+
Den auto-Inkrement einfach übersprungen cnt-3. Ich will wissen, was diese über.
- Im Ergebnis sehen Sie "2 rows affected, 1 warning". Vielleicht ist die Warnung hat etwas zu tun mit es. (edit: es selbst ausprobiert, Gleiches Ergebnis, keine Warnung, MySQL 5.5)
- Die Warnung war diese | Hinweis | 1592 | Unsicher-Anweisung geschrieben, um die Binär-log-Anweisung using-format sein, da BINLOG_FORMAT = - ANWEISUNG. Aussagen, die das schreiben in eine Tabelle mit einer auto-increment-Spalte nach Auswahl aus einer anderen Tabelle sind unsicher, da die Reihenfolge, in der Zeilen abgerufen werden bestimmt was (wenn überhaupt) Zeilen geschrieben werden. Diese Reihenfolge kann nicht vorhergesagt werden und abweichen können, die auf master und slave. |
- OK, scheint nicht zu haben etwas zu tun mit es.
- Ich schaltete binary log und Tat es ohne Fehler, doch es führte zu gleichen.
- Wenn Sie eine normale einfügen nach dem einfügen..wählen Sie, sehen Sie, dass es auch überspringt. Sieht aus wie die Nutzung der temporären Tabelle (das ist, wie insert..select funktioniert) fügt hinzu und löscht eine Zeile oder so etwas.
- Sieht aus wie dieser bug: bugs.mysql.com/bug.php?id=61058
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie ändern innodb_autoinc_lock_mode=0 ("traditionell" lock-Modus) aus meine.ini zu vermeiden skipping Werte im Primärschlüssel in einigen Fällen. Finden Sie im Handbuch mysql-Handbuch für innodb-auto-Inkrement-handling für mehr details.
Andere Sache zu prüfen, ist der Wert der auto_increment_increment config-variable. Es ist 1 standardmäßig, aber Sie können haben dies geändert. es ist sehr ungewöhnlich, um es zu etwas, das größer als 1, oder 2, aber möglich.
Oder wenn es nicht in Ihrem Fall können Sie auch Abfragen, wie die Antwort von AnandPhadke in dieser gleichen Seite wie :
Setzen Sie in Ihrem Mein.cnf:
Setzen Sie den auto_increment-Wert um 1 jedes mal vor dem einfügen von Werten in die Tabelle: