MySQL-Referenzhandbuch sagt dazu folgendes:
Zitat:
LAST_INSERT_ID(), LAST_INSERT_ID(expr)
Gibt den ersten automatisch erzeugten Wert zurück, der für eine AUTO_INCREMENT-Spalte durch die aktuelle INSERT- oder UPDATE-Anweisung eingestellt wurde, die eine solche Spalte modifiziert hat.
mysql> SELECT LAST_INSERT_ID();
-> 195
Die erzeugte Kennung wird auf dem Server verbindungsspezifisch gehandhabt: Der von der Funktion an einen bestimmten Client zurückgegebene Wert ist der erste AUTO_INCREMENT-Wert, der für die zuletzt abgesetzte Anweisung, die eine AUTO_INCREMENT-Spalte betraf, von diesem Client erzeugt wurde. Dieser Wert darf nicht von anderen Clients bearbeitet werden, auch wenn diese selbst AUTO_INCREMENT-Werte erzeugen. Dieses Verhalten gewährleistet, dass jeder Client seine eigene Kennung abrufen kann, ohne die Aktivitäten anderer Clients berücksichtigen oder Sperren setzen bzw. Transaktionen verwenden zu müssen.
Der Wert von LAST_INSERT_ID() wird nicht geändert, wenn Sie die AUTO_INCREMENT-Spalte eines Datensatzes auf einen „nichtmagischen“ Wert (d. h. einen Wert, der nicht NULL und nicht 0 ist) setzen.
Die Methode mit dem SELECT kann fehlerhafte Daten zurückliefern, wenn quasi gleichzeitig mehrere Einfügeoperationen durchgeführt werden (z.B. Script wird 2 mal gleichzeitig ausgeführt) und es dadurch zu einer Race Condition kommt. Bei LAST_INSERT_ID() kann das nicht passieren, weil es Verbindungsspezifisch ist.
--> Man sollte auf jeden Fall LAST_INSERT_ID() bevorzugen.