Das AUTO_INCREMENT-Verhalten von MySQL in einer mehrzeiligen Einfügung

8

Ich denke, die Antwort auf meine Frage ist offensichtlich, aber da ich keine Dokumentation finden konnte, um sie zu unterstützen, dachte ich, dass es sich lohnt, danach zu fragen. Zumindest für die Aufzeichnung.

Wie wir alle wissen, werden AUTO_INCREMENT -Felder jedes Mal inkrementiert, wenn eine INSERT -Anweisung ausgeführt wird. Und sein Wert kann von LAST_INSERT_ID() function abgerufen werden. Es wird auch im MySQL-Handbuch erwähnt, dass bei Einsätzen mit mehreren Zeilen LAST_INSERT_ID() gibt die erste ID der eingefügten Zeilen zurück. Was ich denke, ist eine gute Idee (wirklich nützlich).

Also hier geht meine Frage:

Kann ich in einer INSERT IGNORE INTO -Anweisung mit mehreren Zeilen davon ausgehen, dass die eingefügten IDs eines AUTO_INCREMENT -Feldes immer sequentiell sind? Beachten Sie, dass aufgrund von IGNORE Modifier und der Multi-User-Natur des MySQL-Servers verschiedene Szenarien auftreten können.

Danke.

    
Mehran 01.08.2011, 08:06
quelle

1 Antwort

6

Nein, das kannst du nicht annehmen. Ein Szenario, in dem IDs nicht sequenziell sind, ist in replizierten Multi-Master-Setup. Wenn zum Beispiel zwei Server in einem solchen Setup vorhanden sind, erzeugt man nur gerade automatische IDs und die anderen nur ungerade IDs (beachte, dass es nur ein Beispiel ist).

Aber wenn dein Setup nicht so ist, dann ja. Zumindest in InnoDB sind Inserts atomar und werden in die Warteschlange gestellt, wenn sie auf dieselbe Tabelle zielen, so dass IDs von zwei verschiedenen INSERTs nicht verschachtelt werden. (Es ist jedoch nicht dokumentiert, also darauf angewiesen ist ... ein bisschen riskant)

Wie ich IGNORE INSERT ID Generation getestet habe:

%Vor%     
Mchl 01.08.2011, 08:35
quelle