Bin ich richtig zu verstehen, dass mysql LAST_INSERT_ID() -Funktion zwischen Inserts versucht nicht zurückgesetzt (wie @@ Identität tut in SQL-Server) ... dass, wenn die sofort Wenn der vorherige Einfügevorgang fehlschlägt, gibt LAST_INSERT_ID() den Wert pk zurück, unabhängig davon, was der letzte Einfügewert dieser Verbindung in die Tabelle mit einem automatisch inkrementierenden Primärschlüssel eingegeben wurde. Und wenn ich in dieser Hinsicht richtig bin, scheint dies nicht nur das Verhalten der Funktion zu sein, das am stärksten zurückgeblieben ist? Gibt es keine mysql-Funktion, die sich ähnlich wie die @@ Identität von sql-server verhält? Eine, die NULL zurückgibt, wenn der unmittelbar vorhergehende Einfügeversuch keinen neuen Datensatz erstellt? Oder wie kann man den Primärschlüssel der letzten Einfügeoperation mit Sicherheit kennen?mysql @@ identity vs sql-server last_insert_id()
Antwort
@@ Identität ist in der Regel in SQL Server auch falsch. Sie sollten stattdessen in den meisten Fällen scope_identity()
verwenden.
In MySql sollte last_insert_id() sicher zu verwenden sein, da Sie diese Funktion nach einem Einfügefehler nur aufrufen können, wenn Sie den Einfügungsfehler bereits korrekt erfasst und berücksichtigt haben. Sonst würden Sie immer noch Befehle verarbeiten. Mit anderen Worten, last_insert_id() ist nicht Ihr Fehlerbehandlungsmechanismus.
@paragraph 2 - lässt mich überdenken, wie ich die insert-Anweisung strukturiere ... in diesem Fall bestimmt die where-Klausel in der SELECT-Anweisung, die die Einfügung füttert, ob überhaupt eine Einfügung stattfindet. Mit anderen Worten, die Einfügung ist 0+ Datensätze abhängig von den Bedingungen der Where-Klausel. Ich denke, ich kann diese außerhalb des Einsatzes ziehen und den Einsatz bedingt durchführen. nette Abhilfe, aber es fühlt sich wie ein Workaround für mich an. – codemonkey
Sie müssen prüfen, ob die Einfügung zuerst erfolgreich war. Wenn die Einfügung erfolgreich war, können Sie sich auf LAST_INSERT_ID() verlassen.
edit: in php:
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');
mysql_query('<PUT YOUR INSERT HERE');
if(mysql_affected_rows()>0){
$last_id=mysql_insert_id();
}else{
//panic!
}
?>
Ich frage mich, ob es eine native mysql-Funktion ähnlich wie phs msyql_affected_rows() ist? All unser dml befindet sich in der Datenbank als gespeicherte Prozeduren/Funktionen. – codemonkey
http://php.net/manual/en/function.mysql-query.php Für andere Arten von SQL-Anweisungen, INSERT, UPDATE, DELETE, DROP usw., gibt mysql_query() TRUE bei Erfolg oder FALSE bei Fehler zurück. – Notinlist
Eine Insert-Anweisung könnte "erfolgreich" sein und KEIN Einfügen. Betrachten Sie eine INSERT IGNORE-Anweisung. In diesem Fall führt die Verwendung des Rückgabewerts von mysql_query() zu einem falschen Ergebnis. –
@@ Identität gibt Ihnen den jüngsten Einsatz in jedem Bereich. Dies könnte das Ergebnis eines Triggers sein, der nichts mit der gerade ausgeführten insert-Anweisung zu tun hat. In SQL Server möchten Sie in der Regel die Funktion scope_identity() verwenden. – feihtthief
@feihtthief - thx, gute Klarstellung +1 – codemonkey
Bitte beachten Sie, dass SQL Server's @@ identity und scope_identity(), wenn sie mit mehrzeiligen Beilagen auf einem Server mit mehreren Prozessoren verwendet werden, falsche Antworten geben können! Das Verwenden von OPTION (MAXDOP 1) ist eine Problemumgehung. – ErikE