Ja, diese Abfrage gibt die letzte ID der Tabelle zurück. Eine Bedingung ist jedoch, dass die ID der Primärschlüssel sein muss. So können Sie Reue vermeiden.
Sathish
7
@sathish: Das Hauptproblem dieser Methode ist die Parallelität .
CMS
3
Um es näher zu erläutern: Das Problem dabei ist, dass Sie möglicherweise eine ID erhalten, die nicht Ihre letzte ID ist, wenn jemand anderes etwas in die Tabelle zwischen Ihrer INSERTund der Abfrage einfügt . MAX(id)
Täuschung
3
@ Jocelyn diese Frage wurde ein Jahr später mit Tausenden weniger Ansichten als diese Frage gestellt.
Naftali aka Neal
3
@Neal, du hast recht. Die andere Frage sollte als Duplikat dieser Frage geschlossen werden.
Das Problem bei diesem ist, dass Sie die falsche ID erhalten können, wenn viele Einfügungen auftreten (z. B. wenn Ihre Datenbank auch etwas protokolliert).
Mike
@ Mike Nicht, wenn Sie mysql_insert_iddirekt nach Ihrem verwenden mysql_query. Wenn Sie dazwischen natürlich mehrere andere Abfragen über dieselbe Verbindung ausführen, kann Ihnen dort nichts weiterhelfen.
Täuschung
7
Um sicherzustellen, dass Sie NIEMALS eine falsche ID erhalten, verpacken Sie Ihren Code mit einer TRANSAKTION .
Marcelo Assis
28
mysql stellt sicher, dass dies die letzte ID DER AKTUELLEN VERBINDUNG ist. Es gibt also keine Probleme, wenn Sie diese Anweisung direkt nach der Einfügeabfrage einfügen. Keine Sorge, dass andere Prozesse Einfügungen ausführen. Sie müssen dies nicht in eine Transaktion einschließen. Im MySQL-Handbuch heißt es: "Die generierte ID wird pro Verbindung auf dem Server verwaltet. Dies bedeutet, dass der von der Funktion an einen bestimmten Client zurückgegebene Wert der erste AUTO_INCREMENT-Wert ist, der für die letzte Anweisung generiert wurde, die eine AUTO_INCREMENT-Spalte betrifft von diesem Client . Dies ist der Grund dafür ist , sollten Sie nicht MAX (ID) verwenden , wählen
woens
1
@deceze, was ist mit dieser PDOVoreingenommenheit, die wir überall sehen? Schauen wir uns noch einmal den Funktionsvergleich an. Es ist klar, dass dies mysqlider Gewinner ist, wenn Sie sich die Hände mit Sachen auf niedrigem Niveau schmutzig machen müssen. Mit anderen Worten, selbst wenn man wählt PDO er schließlich müssen verwenden mysqlisowieso.
Pacerier
53
Es gibt eine Funktion, um zu wissen, welche ID zuletzt in die aktuelle Verbindung eingefügt wurde
mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
Die Verwendung von max ist eine schlechte Idee, da dies zu Problemen führen kann, wenn Ihr Code gleichzeitig in zwei verschiedenen Sitzungen verwendet wird.
Was Sie geschrieben haben, würde Ihnen das Beste bringen, idvorausgesetzt, sie sind einzigartig und automatisch inkrementiert. Dies wäre in Ordnung, vorausgesetzt, Sie können Probleme mit der Parallelität einladen.
Da Sie MySQL als Datenbank verwenden, gibt es die spezifische Funktion, LAST_INSERT_ID()die nur für die aktuelle Verbindung funktioniert, die die Einfügung durchgeführt hat.
PHP bietet auch dafür eine spezielle Funktion an mysql_insert_id.
Dies ist auch falsch, da empfohlen wird, eine veraltete Bibliothek zu verwenden. Wirklich, löschen Sie diese
STT LCU
@STTLCU Welches Snippet hier ist veraltet?
TheBlackBenzKid
@ TheBlackBenzKid beide, weil sie auf mysql_ * -Funktionen basieren
STT LCU
@Rahul $ id = last_insert_id (); funktioniert nicht, da es möglicherweise veraltet ist.
Esha
3
So erhalten Sie die zuletzt eingefügte ID im Codeigniter Verwenden Sie nach dem Ausführen der Einfüge-Abfrage nur eine Funktion, die insert_id()für die Datenbank aufgerufen wird. Sie gibt die zuletzt eingefügte ID zurück
Ex:
$this->db->insert('mytable',$data);
echo $this->db->insert_id();//returns last inserted id
Die Verwendung mysql_insert_id()ist in Ordnung , es gibt jedoch einen speziellen Hinweis zur Verwendung. Sie müssen ihn nach der ausgeführten INSERT-Abfrage aufrufen, dh in derselben Skriptsitzung. Wenn Sie es sonst verwenden, würde es nicht richtig funktionieren.
$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
Ich bevorzuge die Verwendung einer reinen MySQL-Syntax, um die letzte auto_increment-ID der gewünschten Tabelle zu erhalten.
php mysql_insert_id () und mysql last_insert_id () geben nur die letzte Transaktions-ID an.
Wenn Sie die letzte automatisch inkrementierte ID einer Tabelle in Ihrem Schema (nicht nur die letzte Transaktion 1) möchten, können Sie diese Abfrage verwenden
SELECT AUTO_INCREMENT FROM information_schema.TABLES
WHERE TABLE_SCHEMA ='my_database'
AND TABLE_NAME ='my_table_name';
Ich bin mir nicht sicher, da diese SQL im Kontext der Frage einfach falsch ist. Auch diese Methode ist anfällig für mögliche Rennbedingungen, wenn zwei oder mehr Clients diese SQL ungefähr zur gleichen Zeit ausführen. Ich bin mir nicht sicher Wie schnell diese Spaltendaten nach einer Einfügung aktualisiert werden, was mich zweifelhaft macht. Die PHP-Funktionen, die die letzte ID erhalten können, basieren auf der Verbindungs- / Sitzungsebene (entspricht mehr oder weniger der LAST_INSERT_ID () von MySQL ), wodurch die Race-Bedingungen gespeichert werden
Raymond Nijland,
1
Es ist traurig, keine Antworten mit einem Beispiel zu sehen.
Verwenden von Mysqli :: $ insert_id :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id;// returns last ID
Verwenden von PDO :: lastInsertId :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId();// returns last ID
Mit MySQLiTransaktion konnte ich manchmal nicht bekommen mysqli::$insert_id, weil es 0 zurückgab. Besonders wenn ich gespeicherte Prozeduren verwendete, die INSERTs ausführten . Es gibt also einen anderen Weg innerhalb der Transaktion:
Dies gibt die zuletzt eingefügte ID der aktuellen Verbindung zurück. Wenn Sie Ihre Verbindungen ordnungsgemäß verwalten, sollte dies funktionieren. Hat zumindest für mich gearbeitet.
Bei all diesen Diskussionen gehe ich davon aus, dass der Grund für die Überprüfung der maximalen ID darin besteht, zu wissen, welche ID als nächstes kommen soll. (Wenn meine maximale ID 5 ist, ist der nächste 5 + 1 = 6).
>> Wenn dies nicht der Grund ist, entschuldige ich mich am besten
Wenn jemand anderes Informationen zwischen Ihrem CHECK und INSERT einfügt, erhalten Sie eine falsche ID.
Es kann also gelöst werden, wenn Sie einen Hash erstellen, der einen Zeitstempel oder einen anderen eindeutigen Wert enthält.
Dann können Sie in derselben Funktion Ihre Informationen mit leeren Werten und Ihrem Hash einfügen. Das würde eine ID erstellen, wenn Sie AUTO_INCRECEMENT ausgewählt haben.
Dann hätten Sie in derselben Funktion immer noch Ihren Hash und könnten nach einer ID mit demselben Hash suchen. Und dann können Sie das Auffüllen leerer Werte mit mysql UPDATE abschließen.
Dies beinhaltet ein bisschen mehr Verbindungen, aber es ist immer noch eine Möglichkeit, dies zu tun ...
Wenn Ihre Tabelle eine AUTO INCREMENT-Spalte wie UserID, Emp_ID, .. hat, können Sie diese Abfrage verwenden, um den zuletzt eingefügten Datensatz
SELECT * FROM table_name abzurufen, wobei UserID = (wählen Sie MAX (UserID) aus table_name).
Im PHP-Code:
$con = mysqli_connect('localhost','userid','password','database_name');if(!$con){die('Could not connect: '. mysqli_error($con));}
$sql ="SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
$result = mysqli_query($con, $sql);
Dann können Sie abgerufene Daten als Ihre Anforderung verwenden
INSERT
und der Abfrage einfügt .MAX(id)
Antworten:
Wenn Sie PDO verwenden, verwenden Sie
PDO::lastInsertId
.Wenn Sie Mysqli verwenden, verwenden Sie
mysqli::$insert_id
.Wenn Sie immer noch MySQL verwenden:
Aber wenn Sie müssen, verwenden Sie
mysql_insert_id
.quelle
mysql_insert_id
direkt nach Ihrem verwendenmysql_query
. Wenn Sie dazwischen natürlich mehrere andere Abfragen über dieselbe Verbindung ausführen, kann Ihnen dort nichts weiterhelfen.PDO
Voreingenommenheit, die wir überall sehen? Schauen wir uns noch einmal den Funktionsvergleich an. Es ist klar, dass diesmysqli
der Gewinner ist, wenn Sie sich die Hände mit Sachen auf niedrigem Niveau schmutzig machen müssen. Mit anderen Worten, selbst wenn man wählt PDO er schließlich müssen verwendenmysqli
sowieso.Es gibt eine Funktion, um zu wissen, welche ID zuletzt in die aktuelle Verbindung eingefügt wurde
Die Verwendung von max ist eine schlechte Idee, da dies zu Problemen führen kann, wenn Ihr Code gleichzeitig in zwei verschiedenen Sitzungen verwendet wird.
Diese Funktion heißt mysql_insert_id
quelle
Es ist in Ordnung. Sie können auch LAST_INSERT_ID () verwenden
quelle
select max(id)from table
das in Ordnung ist?Mit gU :
Mit Mysqli :
Bitte verwenden Sie keine
mysql_*
Funktionen in neuem Code . Sie werden nicht mehr gewartet und sind offiziell veraltet . Sehen Sie die rote Box ? Erfahrenmehr über vorbereitete Anweisungen statt, und verwenden Sie PDO oder MySQLi - dieser Artikel wird Ihnen helfen, entscheidenwelche. Wenn Sie sich für PDO entscheiden, finden Sie hier ein gutes Tutorial .quelle
PDO
Voreingenommenheit wir ........Was Sie geschrieben haben, würde Ihnen das Beste bringen,
id
vorausgesetzt, sie sind einzigartig und automatisch inkrementiert. Dies wäre in Ordnung, vorausgesetzt, Sie können Probleme mit der Parallelität einladen.Da Sie MySQL als Datenbank verwenden, gibt es die spezifische Funktion,
LAST_INSERT_ID()
die nur für die aktuelle Verbindung funktioniert, die die Einfügung durchgeführt hat.PHP bietet auch dafür eine spezielle Funktion an
mysql_insert_id
.quelle
Versuchen Sie, dies sollte gut funktionieren:
quelle
Sie können die zuletzt eingefügte ID über die integrierte PHP-Funktion abrufen
mysql_insert_id();
Sie erhalten auch die neueste ID von
quelle
So erhalten Sie die zuletzt eingefügte ID im Codeigniter Verwenden Sie nach dem Ausführen der Einfüge-Abfrage nur eine Funktion, die
insert_id()
für die Datenbank aufgerufen wird. Sie gibt die zuletzt eingefügte ID zurückEx:
in einer Zeile
quelle
Die Verwendung
mysql_insert_id()
ist in Ordnung , es gibt jedoch einen speziellen Hinweis zur Verwendung. Sie müssen ihn nach der ausgeführten INSERT-Abfrage aufrufen, dh in derselben Skriptsitzung. Wenn Sie es sonst verwenden, würde es nicht richtig funktionieren.quelle
Sauber und einfach -
quelle
HINWEIS: Wenn Sie mehrere Einfügungen mit einer Anweisung ausführen, ist mysqli :: insert_id nicht korrekt.
Der Tisch:
create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));
Wenn Sie dies tun:
insert into xyz (name) values('one'),('two'),('three');
Die mysqli :: insert_id ist 1 nicht 3.
Um den richtigen Wert zu erhalten, gehen Sie wie folgt vor:
mysqli::insert_id + mysqli::affected_rows) - 1
Dies wurde dokumentiert, ist aber etwas dunkel.
quelle
Ich bevorzuge die Verwendung einer reinen MySQL-Syntax, um die letzte auto_increment-ID der gewünschten Tabelle zu erhalten.
php mysql_insert_id () und mysql last_insert_id () geben nur die letzte Transaktions-ID an.
Wenn Sie die letzte automatisch inkrementierte ID einer Tabelle in Ihrem Schema (nicht nur die letzte Transaktion 1) möchten, können Sie diese Abfrage verwenden
Das ist es.
quelle
Es ist traurig, keine Antworten mit einem Beispiel zu sehen.
Verwenden von Mysqli :: $ insert_id :
Verwenden von PDO :: lastInsertId :
quelle
Mit
MySQLi
Transaktion konnte ich manchmal nicht bekommenmysqli::$insert_id
, weil es 0 zurückgab. Besonders wenn ich gespeicherte Prozeduren verwendete, dieINSERT
s ausführten . Es gibt also einen anderen Weg innerhalb der Transaktion:quelle
Verwenden Mysqli als mysql depricating ist
quelle
Ich habe es versucht
mysqli_insert_id ($ dbConnectionObj)
Dies gibt die zuletzt eingefügte ID der aktuellen Verbindung zurück. Wenn Sie Ihre Verbindungen ordnungsgemäß verwalten, sollte dies funktionieren. Hat zumindest für mich gearbeitet.
quelle
Bitte verwenden Sie PDP und versuchen Sie dies dann
quelle
$ lastid = mysql_insert_id ();
quelle
Bei all diesen Diskussionen gehe ich davon aus, dass der Grund für die Überprüfung der maximalen ID darin besteht, zu wissen, welche ID als nächstes kommen soll. (Wenn meine maximale ID 5 ist, ist der nächste 5 + 1 = 6).
>> Wenn dies nicht der Grund ist, entschuldige ich mich am besten
Wenn jemand anderes Informationen zwischen Ihrem CHECK und INSERT einfügt, erhalten Sie eine falsche ID.
Es kann also gelöst werden, wenn Sie einen Hash erstellen, der einen Zeitstempel oder einen anderen eindeutigen Wert enthält.
Dann können Sie in derselben Funktion Ihre Informationen mit leeren Werten und Ihrem Hash einfügen. Das würde eine ID erstellen, wenn Sie AUTO_INCRECEMENT ausgewählt haben.
Dann hätten Sie in derselben Funktion immer noch Ihren Hash und könnten nach einer ID mit demselben Hash suchen. Und dann können Sie das Auffüllen leerer Werte mit mysql UPDATE abschließen.
Dies beinhaltet ein bisschen mehr Verbindungen, aber es ist immer noch eine Möglichkeit, dies zu tun ...
Viel Glück beim Lösen.
quelle
Wenn Ihre Tabelle eine AUTO INCREMENT-Spalte wie UserID, Emp_ID, .. hat, können Sie diese Abfrage verwenden, um den zuletzt eingefügten Datensatz SELECT * FROM table_name abzurufen, wobei UserID = (wählen Sie MAX (UserID) aus table_name). Im PHP-Code:
Dann können Sie abgerufene Daten als Ihre Anforderung verwenden
quelle
quelle