Ok, nehmen wir an, ich mache ein MySQL INSERT
in einer meiner Tabellen und die Tabelle hat die Spalte, item_id
die auf autoincrement
und gesetzt ist primary key
.
Wie kann ich die Abfrage veranlassen, 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 dies scheint kaum eine gute Vorgehensweise zu sein, da dies möglicherweise zu einem falschen Ergebnis führt ...
Wenn dies nicht möglich ist, wie kann ich dann sicherstellen, dass ich die richtige ID abrufe?
mysql
insert
key
auto-increment
Amy Neville
quelle
quelle
INSERT
solche Abfrage zurückzugeben. Warum könnte es Ihrer Meinung nach zu einem falschen Ergebnis führen?Antworten:
Sie müssen die
LAST_INSERT_ID()
Funktion verwenden: http://dev.mysql.com/doc/refman/5.0/de/information-functions.html#function_last-insert-idZ.B:
Dies wird Ihnen den Rücken
PRIMARY KEY
Wert der letzten Zeile , die Sie eingefügt:So kehrte der Wert von
LAST_INSERT_ID()
ist pro Benutzer und ist unbeeinflusst von anderen Abfragen , die auf dem Server ausgeführt werden können von anderen Benutzern .quelle
PRIMARY KEY
Wert der letzten Zeile zurück, die Sie erstellt haben eingefügt, da es pro Verbindung ist - jede Verbindung zum Server wird beibehalten ein eigener Wert für diese ist. Ich habe die Antwort aktualisiert, um dies zu verdeutlichen.IN ACHT NEHMEN !! von "LAST_INSERT_ID ()", wenn versucht wird, diesen Primärschlüsselwert in PHP zurückzugeben.
Ich weiß, dass dieser Thread nicht mit PHP gekennzeichnet ist, aber für alle, die auf diese Antwort gestoßen sind und eine MySQL-Einfügungs-ID von einer PHP-Skript-Einfügung mit Standardaufrufen von mysql_query zurückgeben möchten - dies funktioniert nicht und ist ohne Erfassung von SQL-Fehlern nicht offensichtlich.
Das neuere mysqli unterstützt mehrere Abfragen - wobei LAST_INSERT_ID () tatsächlich eine zweite Abfrage aus dem Original ist.
IMO ist ein separates SELECT zur Identifizierung des letzten Primärschlüssels sicherer als die optionale Funktion mysql_insert_id (), die die aus der vorherigen INSERT-Operation generierte AUTO_INCREMENT-ID zurückgibt.
quelle
LAST_INSERT_ID
ist eine MySQL-Funktion pro Verbindung. Wenn Sie nach der letzten Einfügungs-ID fragen, hat möglicherweise eine separate Verbindung einen Schreibvorgang ausgeführt und Sie haben die falsche ID.mysql_insert_id()
funktioniert auch auf einer Basis pro Verbindung, aber es leidet auch seltsame Verhalten wie hier zu sehen stackoverflow.com/a/897374/1305910 im Kommentar von Cliffordlife - macht nichts , wir sollten alle verwendet habenmysqli
Von dem
LAST_INSERT_ID()
Dokumentation:Wenn Sie zwei separate Anforderungen gleichzeitig an das Skript haben, wirken sich diese nicht gegenseitig aus
LAST_INSERT_ID()
(es sei denn, Sie verwenden möglicherweise eine dauerhafte Verbindung).quelle
Hier was Sie suchen !!!
Dies ist die beste Alternative von
SCOPE_IDENTITY()
Funktion, in der verwendet wirdSQL Server
.Sie müssen auch bedenken, dass dies nur funktioniert, wenn
Last_INSERT_ID()
es von Ihnen ausgelöst wirdInsert
Abfrage . Das heißt, die Abfrage gibt die in das Schema eingefügte ID zurück. Sie können die zuletzt eingefügte ID einer bestimmten Tabelle nicht abrufen.Weitere Informationen finden Sie unter dem Link Das Äquivalent der SQLServer-Funktion SCOPE_IDENTITY () in mySQL?
quelle
Wenn Sie den Wert benötigen, bevor Sie eine Zeile einfügen:
Sie können dies in einer Beilage verwenden:
quelle
Sie erhalten diese Parameter in Ihrem Abfrageergebnis:
Das
insertId
ist genau das, was Sie brauchen.(NodeJS-mySql)
quelle
Wenn Sie in Python pymysql verwenden, können Sie vom Cursor aus cursor.lastrowid verwenden
quelle
benutze einfach "$ last_id = mysqli_insert_id ($ conn);"
quelle
Wenn Sie PHP verwenden: Auf einem PDO- Objekt können Sie nach dem Einfügen einfach die lastInsertId- Methode aufrufen .
Andernfalls können Sie mit einer LAST_INSERT_ID den folgenden Wert erhalten:
SELECT LAST_INSERT_ID();
quelle
Ich habe
return $this->db->insert_id();
für Codeigniter verwendetquelle
Ich möchte nur meinen Ansatz dazu in PHP teilen. Einige von Ihnen fanden es vielleicht nicht effizient, aber dies ist 100 besser als andere verfügbare Optionen.
Generieren Sie einen zufälligen Schlüssel und fügen Sie ihn in die Tabelle ein, um eine neue Zeile zu erstellen. Dann können Sie diesen Schlüssel verwenden, um den Primärschlüssel abzurufen. Verwenden Sie das Update, um Daten hinzuzufügen und andere Dinge zu tun.
Auf diese Weise können Sie eine Zeile sichern und den richtigen Primärschlüssel haben.
Ich empfehle dies wirklich nicht, es sei denn, Sie haben keine anderen Optionen.
quelle