Frage

EDIT: Diese Frage Titel ursprünglich war: Wie funktioniert Lehre weiß letzte Eingabe-ID in MySQL und wurde auf Lehre ORM-Mapper verwendet?. Nach einigem Graben fand ich heraus, dass diese Frage nicht bezieht Lehre , sondern pdo_mysql MySQL-C-API und schließlich - auf MySQL-Client-Server Kommunikation. Ich habe beschlossen, den Titel zu ändern, so dass vielleicht jemand Antwort auf seine / ihre Frage finden werden.

Für diejenigen, die mit Lehre nicht: Ich war neugierig, warum unten:

mysql_query("INSERT INTO category (name) VALUES('cat')");
echo mysql_insert_id();

oder ähnlich:

$pdo->exec("INSERT INTO category (name) VALUES('cat')");
echo $pdo->lastInsertId();

wird nur eine Position (ohne gesonderte SELECT LAST_INSERT_ID()) führen in log:

1701 Query    INSERT INTO category (name) VALUES ('cat')

Original Frage:

Ich habe 2 Tabellen:

category(id,name)
product(id, name, categoryId)

Ich habe neue Kategorie Objekt und Produkt-Objekt. I zugeordnet Kategorie Objekt Produkt-Objekt. Ich habe keine ids gesetzt:

$product = new Product();
$product->name = 'asdf';

$category = new Category();
$category->name = 'cat';

$product->Category = $category;

Danach habe ich gespült, um die Verbindung und die Prüfung MySQL Logs:

1684 Query  START TRANSACTION
1684 Query  INSERT INTO category (name) VALUES ('cat')
1684 Query  INSERT INTO product (name, categoryid) VALUES ('asdf', '312')
1684 Query  COMMIT

Wie hat Lehre wissen, dass die neu geschaffene Kategorie-ID ist 312? Es gibt nichts anderes in Protokollen.

War es hilfreich?

Lösung

habe ich einige der Forschung und einige Quellcode finden, so meine Antwort ein wenig falsch sein könnte und nicht präzise.

Zunächst einmal ist dies nicht wirklich im Zusammenhang mit Lehre . Lehre verwendet PDO_MYSQL . Aber intern PDO_MYSQL verwendet die gleiche Sache wie mysql_insert_id Funktion - Mutter MySQL-C-API Funktion -. mysql_insert_id

Der Grund, warum gibt es keine separate SELECT LAST_INSERT_ID() liegt in der Tatsache, dass, nachdem die Anweisung ausgeführt wird (in meinem Beispiel INSERT), Server antwortet mit Daten und einige andere in enthalten Dinge OK Packet ), einschließlich insert_id. Also, wenn wir Feuer mysql_insert_id() wir nicht mit dem Server verbinden, erhalten insert_id - mysql Bibliothek muss nicht tun, dass - es bereits diesen Wert aus dem letzten Ausführung der Abfrage gespeichert hat (zumindest ich denke, so dass nach der Datei libmysql.c Analyse)

OK Packet ist hier beschrieben: MySQL Allgemeinantwortpakete - OK Packet

Andere Tipps

last_insert_id funktioniert nur für AUTO_INCREMENT Spalten. Es wird nicht funktionieren, wenn Sie einen Wert manuell in die AUTO_INCREMENT Spalte einfügen.

Die Lehre wird funktionieren, weil es genau wie die Zuweisung eines NULL es ist (obwohl man speziell das nie schreiben). Dies löst die Autoinkrement und liefert einen Wert für last_insert_id().

Ich habe so ein jpg hier enthalten, dass Sie sie sehen können. Hoffe, es hilft!

eingeben Bild Beschreibung hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top