403 Stimmen

Holen Sie sich den neuen Primärschlüssel-ID Datensatz aus der MySQL INSERT-Abfrage?

Sagen wir, ich mache ein MySQL INSERT in eine meiner Tabellen und die Tabelle hat die Spalte item_id, die auf autoincrement und primary key gesetzt ist.

Wie bekomme ich die Abfrage dazu, den Wert des neu generierten Primärschlüssels item_id in derselben Abfrage auszugeben?

Derzeit führe ich eine zweite Abfrage aus, um die ID abzurufen, aber das scheint kaum eine gute Praxis zu sein, da dies möglicherweise das falsche Ergebnis liefert...

Wenn dies nicht möglich ist, was ist dann die beste Praxis, um sicherzustellen, dass ich die richtige ID abrufe?

509voto

Duncan Lock Punkte 11431

Sie müssen die Funktion LAST_INSERT_ID() verwenden: http://dev.mysql.com/doc/refman/5.0/de/information-functions.html#function_last-insert-id

Zum Beispiel:

INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();

Dadurch erhalten Sie den PRIMARY KEY-Wert der letzten Zeile zurück, die Sie eingefügt haben:

Die generierte ID wird auf Serverseite auf Verbindungsbasis gespeichert. Das bedeutet, dass der vom Server an einen bestimmten Client zurückgegebene Wert der erste AUTO_INCREMENT-Wert ist, der von dem Client für die letzten Anweisung erzeugt wurde, die eine AUTO_INCREMENT-Spalte durch diesen Client betroffen hat.

Der Wert, der von LAST_INSERT_ID() zurückgegeben wird, ist also benutzerspezifisch und wird nicht von anderen Abfragen beeinflusst, die möglicherweise auf dem Server von anderen Benutzern ausgeführt werden.

37voto

VORSICHT !! vor LAST_INSERT_ID(), wenn Sie versuchen, diesen Primärschlüsselwert innerhalb von PHP zurückzugeben.

Ich weiß, dass dieser Thread nicht mit PHP verschlagwortet ist, aber für alle, die auf diese Antwort gestoßen sind und versuchen, eine MySQL-Einfügungs-ID aus einem PHP-gesteuerten Einfügen mithilfe von Standard-mysql_query-Aufrufen zurückzugeben - es funktioniert nicht und ist ohne Erfassung von SQL-Fehlern nicht offensichtlich.

Die neuere mysqli-Version unterstützt mehrere Abfragen - von denen LAST_INSERT_ID() tatsächlich eine zweite Abfrage von der Originalabfrage ist.

Meiner Meinung nach ist ein separates SELECT, um den letzten Primärschlüssel zu identifizieren, sicherer als die optionale mysql_insert_id()-Funktion, die die durch die vorherige INSERT-Operation generierte AUTO_INCREMENT ID zurückgibt.

27voto

MESepehr Punkte 758

Sie erhalten diese Parameter in Ihrem Abfrageergebnis:

    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 66,
    "serverStatus": 2,
    "warningCount": 1,
    "message": "",
    "protocol41": true,
    "changedRows": 0

Die insertId ist genau das, was Sie brauchen.

(NodeJS-mySql)

27voto

Explosion Pills Punkte 182627

Aus der LAST_INSERT_ID()-Dokumentation:

Die generierte ID wird auf dem Server auf pro-Verbindungsbasis beibehalten

Das bedeutet, dass bei zwei separaten Anfragen an das Skript gleichzeitig die LAST_INSERT_ID() der anderen nicht beeinflussen (es sei denn, Sie verwenden möglicherweise eine persistente Verbindung).

24voto

PVR Punkte 2476

Hier finden Sie, wonach Sie suchen !!!

select LAST_INSERT_ID()

Dies ist die beste Alternative zur SCOPE_IDENTITY()-Funktion, die in SQL Server verwendet wird.

Sie müssen auch daran denken, dass dies nur funktioniert, wenn Last_INSERT_ID() nach Ihrer Insert-Abfrage aufgerufen wird. Das bedeutet, dass die Abfrage die eingefügte ID im Schema zurückgibt. Sie können nicht die letzte eingefügte ID einer bestimmten Tabelle erhalten.

Weitere Details finden Sie unter dem Link Das Äquivalent der SQLServer-Funktion SCOPE_IDENTITY() in mySQL?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X