ID von neuem Datensatz

Hi,

Es existiert eine MySQL-Tabelle mit Namen 'Tabelle', darin befinden sich mehrere Felder, eines davon ist der Primaerschluessel 'ID' mit auto_increment.

Wenn ich jetzt mittels
Code:
INSERT INTO `Tabelle` (...) VALUES (...);
einen neuen Datensatz anlege, vergibt MySQL ja selbststaendig eine ID.

Wie komme ich jetzt an eben diese ID, des _gerade_ erzeugten Datensatzes ran?


Code:
SELECT MAX(`ID`) FROM `Tabelle`;
funktioniert nicht immer, da zwischen diesen Beiden Befehlen eventuell bereits ein weiter Datensatz eingefuegt wurde...

- MfG Keks :)
 
Da das mit MAX ('ID') ja nicht immer klappt könntest du noch eine Spalte timestamp einfügen. Dann machst du in php eine Variable $ts = time() fügst diese mit in die Zeile ein und liest sie nachher so aus: SELECT ID from 'Tabelle' WHERE timestamp = $ts
 
Steht alles in der Doku ... http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html
Hier wirst du in Bezug auf die letzte Auto-ID auf die API-Funktion mysql_insert_id() verwiesen.

Wenn man das im PHP Manual nachschlägt, findet man ebenfalls eine Funktion mit dem Namen mysql_insert_id(), welche der obigen MySQL-Funktion entspricht.
Da diese Funktion verbindungsorientiert ist, kann es nicht passieren, dass dir jemand in der Zwischenzeit den Wert überschreibt.

mfg, metax.
 
schonmal nach LAST_INSERT_ID gegooglet?
das hilft dir weiter, falls du mit php arbeitest.

mysql_insert_id()

edit: mist, da war einer schneller!
 
Danke, das hat mir schonmal geholfen :)

Es handelt sich uebrigens um Perl, nicht um PHP, da ich aber auf der Suche nach einem passenden SQL-Befehl war, dachte ich nicht dass es relevant sei die Sprache zu nennen :)

- MfG Keks :)
 
Gut zu wissen. Wenn ich das richtig verstanden habe gibt mysql_insert_id() die ID des letzten inserts zurück, unabhängig von dem was in zwischenzeit mit der db passiert ist?
 
da binsch mir nicht ganz sicher, aber ich hab beim rumsuchen über da sproblem mal was von begin / commit blöcken gelesen, damit geschiet die aktion auf einmal und du bekommst mit sicherheit die die zum dem eingefügen datensatz zurück
 
Ähm, warum machst du nicht einfach ein
Code:
SELECT id FROM tabelle ORDER BY id DESC LIMIT 1
Dank ORDER BY id DESC wird absteigend nach id sortiert und LIMIT 1 nimmt nur den ersten Datensatz. Dein Ergebnis ist nun also die letzte eingetragene id.
Edit: Ich les grad ich hab nicht aufgepasst. Wenn tatsächlich zwischen den beiden Befehlen ein weiterer Datensatz eingefügt wurde, dann ist mein Ansatz genauso schlecht wie MAX (id).
Allerdings klappt das mit dem Timestamp auch nicht, weil ja in der gleichen Sekunde ein anderer Datensatz entstanden sein kann. Wenn man nun aber einen verschlüsselten eindeutigen String nehmen würde, würds klappen. Natürlich darf man jetzt nicht den timestamp verschlüsseln, weils wieder den gleichen String geben könnte, aber man könnte zum Beispiel, wenn eine Userverwaltung vorhanden ist oder so, den Benutzer + timestamp verschlüsseln.
Code:
md5('AmShaegar1223849258');
Anschließend die ID dieses Datensatzes ermitteln:
Code:
SELECT id FROM tabelle WHERE key LIKE 'md5('AmShaegar1223849258')'
Es ist unwahrscheinlich, das jemand mit dem gleichen namen in der glecihen Sekunde etwas abschickt oder? ansonsten könnte man noch die ersten 10 Zeichen des Textes oder sonstwas, was möglcih variabel ist, mit in den md5 packen.
Ich hoffe das hilft eher :D

MfG AmShaegar
 
wieso wird die transaktionsgeschichte komplett ignoriert?

Code:
mysql_query("begin");
$res = mysql_query("insert_bla_bla_bla");
$id_res = mysql_query("SELECT LAST_INSERT_ID();")
mysql_query("commit");

liegt an euch, das in jegliche andere sprache umzusetzen.
 
Zurück
Oben