MySQL und Last_insert_id()



  • Hat schon einmal jemand mit dbExpress -Komponenten und last_insert_id() gearbeitet?
    Select last_insert_id() as newid

    Bei mir liefert diese Funktion immer nur "0" zurück. Egal was ich bieher auch angestellt habe.

    Danke!



  • hi habe zwar keine ahnung von dieser funktion aber hier mal ein paar anregungen:
    http://php3.de/manual/de/function.mysql-insert-id.php http://www.perlunity.de/perl/forum/thread_013152.shtml

    was steht denn in deiner tabelle drin ?



  • Hat vieleicht noch jemand eine Idee, wo man sich hinwenden kann?
    Das hier ist ein echtes KO Kriterium ob die MYSQl Datenbank in Verbindung mit dbExpress brauchbar ist. Der folgende Code

    // Daten->SQL-Befehl = TSQLQuery

    Daten->SQLBefehl->Close();
    Daten->SQLBefehl->SQL->Add( "Insert into ...");
    Daten->SQLBefehl->ExecSQL(); // erfolgreich, Satz steht drin
    Daten->SQLBefehl->SQL->Clear();
    Daten->SQLBefehl->SQL->Add("Select last_insert_id() as newid");
    Daten->SQLBefehl->Open();
    long x = Daten->SQLBefehl->Fields->FieldByName("newid")->Value;

    liefert für x = 0 was definitiv falsch ist.

    wird der SQL-Befehl ("Select last_insert_id() as newid") durch ("Select max(id) as newid from ...") ersetzt bekomme ich den richtigen wert. (id ist autoincrement) Dies ist im Multiuserbetrieb allerding unbrauchbar. Die SQL-Befehle sind richtig, da sie im MySQL Client einwanfrei funktionieren.

    So ein Mist.



  • Probiers mal hiermit

    SELECT * FROM tbl_name WHERE id_field IS NULL

    [ Dieser Beitrag wurde am 24.01.2003 um 13:28 Uhr von F98 editiert. ]



  • Versuch mal anstatt:

    long x = Daten->SQLBefehl->Fields->FieldByName("newid")->Value;
    

    folgendes:

    long x = Daten->SQLBefehl->Fields->FieldByName("newid")->AsInteger;
    

    Stimmt der Wert dann immer noch nicht?



  • Also last_insert_id() soll den letzten automatisch vergebenen wert der Spalte ID zurückgeben, und zwar Sitzungsabhängig. Den Hinweis von F98 kann ich nicht verstehen, da es kein id-feld gibt, welches Null ist. Die werte werden richtig vergeben. nur die Funktion liefert immer null. ganz sicher! Habe ich schon mächtig viel getestet. Datentyp ftFMTBcd, Größe 34 und alles \x0.



  • Das brauchste auch nicht verstehen sondern sollte einfach mal anwenden. Statt tbl_name und id_field mußt Du natürlich Deine Tabelle bzw. ID-Spalte einsetzen.

    [ Dieser Beitrag wurde am 24.01.2003 um 14:01 Uhr von F98 editiert. ]



  • Es ist ja schön wenn du versuchst mir zu helfen, aber es gibt bei mir keine ID-Spalte mit dem wert "0", da die Daenbank diesen Wert automatisch hochzählt , und somit liefert auch dein Selectbefehl eine leere Datenmenge zurück. Das hat leider gar nichts mit meine Problem zu tun. Was eine Select Anweisung macht verstehe ich sehr gut.

    Gruß Gh



  • Hallo,

    der Aufruf der Funktion ist etwas anders :

    SELECT LAST_INSERT_ID(Feldname) FROM TableName
    liefert Dir das gewünscte Ergebnis (Quasi als RecordSet in der Reihenfolge des Einfügens!)

    Ciao
    Wilfrid



  • @gh

    1. Vorsicht: 0 != NULL
    2. das NULL am Ende des SELECTs muß man im Zusammenhang mit der gesamten Anweisung sehen, d.h. so wie die Anweisung da steht liefert sie Dir (insofern Du die Autoinc-Spalte und die Tabelle richtig angegeben hast) den letzten Autoinc-Wert zurück.



  • Hallo F98

    dein Select Befehl funktioniert genausogut wie last_insert_id(). Das Problem ist, er muß unmittelbar!! nach der Insert Anweisung erfolgen. Im MySQl Client ist das kein Problem. Die sch.. TSQLQuery Komponente scheint sich aber selber mit der Datenbank zu unterhalten. Selbst wenn ich wie oben angegeben die beiden SQL Befehle hintereinander wegschicke, bekomme ich nicht mehr meine letzten autoinc Wert, sondern einfach 0.

    gruß gh



  • Tja, ist halt so eine Sache. Egal was man macht man bekommt meißt immer eine gültige ID zurück, aber weißt Du auch, ob die von Deinem INSERT ist? Oder doch vielleicht von jemand anderem. Getreu dem Motto: "Der letzte gewinnt!"



  • Die Lösung:

    Die TSQLQuery Komponente darf sich die Verbindung nicht mit einer TSQLTable Komponente teilen. Verwende für die TSQLQuery´s und TSQLTable´s je eine eigene VerbindungsKomponente und schon funktioniert der obige Code.


Anmelden zum Antworten