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

InformationsquelleAutor user1640242 | 2012-09-01
Schreibe einen Kommentar