Ich habe eine Tabelle, in die häufig neue Daten eingefügt werden. Ich muss die allerletzte ID der Tabelle erhalten. Wie kann ich das machen?
Ist es ähnlich SELECT MAX(id) FROM table?
INSERTund der Abfrage einfügt . MAX(id)
Ich habe eine Tabelle, in die häufig neue Daten eingefügt werden. Ich muss die allerletzte ID der Tabelle erhalten. Wie kann ich das machen?
Ist es ähnlich SELECT MAX(id) FROM table?
INSERTund 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:
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 .
Aber wenn Sie müssen, verwenden Sie mysql_insert_id.
mysql_insert_id direkt nach Ihrem verwenden mysql_query. Wenn Sie dazwischen natürlich mehrere andere Abfragen über dieselbe Verbindung ausführen, kann Ihnen dort nichts weiterhelfen.
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.
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.
Diese Funktion heißt mysql_insert_id
Es ist in Ordnung. Sie können auch LAST_INSERT_ID () verwenden
select max(id)from tabledas in Ordnung ist?
Mit gU :
$pdo->lastInsertId();
Mit Mysqli :
$mysqli->insert_id;
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 .
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.
Versuchen Sie, dies sollte gut funktionieren:
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);
echo mysqli_insert_id($link);
Sie können die zuletzt eingefügte ID über die integrierte PHP-Funktion abrufen mysql_insert_id();
$id = mysql_insert_id();
Sie erhalten auch die neueste ID von
$id = last_insert_id();
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
in einer Zeile
echo $this->db->insert('mytable',$data)->insert_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.
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.
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';
Das ist es.
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:
<?php
function getInsertId(mysqli &$instance, $enforceQuery = false){
if(!$enforceQuery)return $instance->insert_id;
$result = $instance->query('SELECT LAST_INSERT_ID();');
if($instance->errno)return false;
list($buffer) = $result->fetch_row();
$result->free();
unset($result);
return $buffer;
}
?>
Verwenden Mysqli als mysql depricating ist
<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);
printf ("New Record has id %d.\n", $mysqli->insert_id);
/* close connection */
$mysqli->close();
?>
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.
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.
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
mysql_query("INSERT INTO mytable (product) values ('kossu')");
printf("Last inserted record has id %d\n", ***mysql_insert_id()***);