Ich stimme mit @Digital Chris's answer überein, dass Sie nicht feststellen sollten, ob eine Einfügung erfolgreich war oder fehlgeschlagen ist, indem Sie den von LAST_INSERT_ID()
zurückgegebenen Wert überprüfen: es gibt mehr direkte Routen wie die betroffene Zeilenanzahl. Dennoch kann es immer noch erforderlich sein, einen "sauberen" Wert von LAST_INSERT_ID()
zu erhalten.
Natürlich ein Problem mit dem vorgeschlagenen Lösung (zum Vergleich gegenüber dem vor dem Einsetzen Wert) ist, dass es passieren könnte, dass das Einfügen erfolgreich war und, die er zugewiesenen Auto-erhöhte Wert zufällig ist das gleiche wie die von die vorherige Einfügung (vermutlich auf einer anderen Tabelle). Der Vergleich könnte daher zu der Annahme führen, dass die Insertion fehlgeschlagen ist, obwohl sie tatsächlich gelungen ist.
Ich empfehle, dass, wenn überhaupt möglich, vermeiden Sie die Verwendung der LAST_INSERT_ID()
SQL-Funktion für den API-Aufruf mysql_insert_id()
(über Ihren Treiber). Wie in der Dokumentation für das letztere erklärt:
mysql_insert_id()
kehrt 0
, wenn die vorherige Anweisung einen AUTO_INCREMENT
Wert nicht verwendet. Wenn Sie den Wert für später speichern möchten, rufen Sie sofort nach der Anweisung, die den Wert generiert, mysql_insert_id()
auf.
[ deletia ]
Der Grund für die Unterschiede zwischen LAST_INSERT_ID()
und mysql_insert_id()
ist, dass LAST_INSERT_ID()
leicht gemacht wird, in Skripten zu verwenden, während mysql_insert_id()
versucht über genauere Informationen zu liefern, was passiert mit der AUTO_INCREMENT
Spalte.
In jedem Fall, wie unter LAST_INSERT_ID(expr)
dokumentiert:
Wenn expr
wird als Argument an LAST_INSERT_ID()
gegeben, wird der Wert des Arguments von der Funktion zurückgegeben und wird als die in Erinnerung nächster Wert, der von LAST_INSERT_ID()
zurückgegeben werden soll.
daher vor der Durchführung Ihrer INSERT
, könnten Sie zurückgesetzt mit:
SELECT LAST_INSERT_ID(NULL);
Dies sollte auch den Wert von mysql_insert_id()
zurückzusetzen, obwohl die Dokumentation der Aufruf an LAST_INSERT_ID(expr)
schlägt vor, innerhalb von ein INSERT
nehmen müssen oder UPDATE
Anweisung — erfordert möglicherweise Tests zur Überprüfung.Auf jeden Fall sollte es ziemlich trivial sein, um eine solche Aussage no-op, wenn dies erforderlich ist:
INSERT INTO my_table (my_column) SELECT NULL WHERE LAST_INSERT_ID(NULL);
Es kann sich lohnen, unter Hinweis darauf, dass man auch die identity
und last_insert_id
Systemvariablen einstellen können (aber nur diese beeinflussen der Wert von LAST_INSERT_ID()
und nicht von mysql_insert_id()
zurückgegeben):
SET @@last_insert_id := NULL;
Dies ist ein teilweise gelöstes Problem. Könnten Sie das ursprüngliche Problem, das Sie lösen möchten, veröffentlichen? –
Was ist falsch an der Verwendung von 'row_count', wie von Digital Chris vorgeschlagen? – rsanchez