letzten Datensatz löschen



  • Den "letzten Datensatz" bekommst Du mit etwa folgender SQL-Anweisung:

    SELECT MAX(id) FROM schnutzelfutz
    

    Dabei ist 'id' dein AUTO_INCREMENT-Feld und 'schnutzelfutz' die Tabelle. Damit kannst Du dann problemlos den letzten Datensatz löschen:

    DELETE FROM schnutzelfutz WHERE id='xx'
    

    'xx' ist die Nummer des letzten Datensatzes.



  • Ok, wieder was gelernt 😃



  • Danke!



  • Das war leider ein Mal zu viel. Habe aber trotzdem noch 10 Min. gebraucht bis ich kapiert habe, dass fetch_row noch benötigt wird.



  • Könnte man das nicht auch direkt in einen Befehl schreiben (müsstest du ausprobieren 😉 ):

    DELETE FROM schnutzelfutz WHERE id = MAX(id)
    


  • geht es zufällig darum, den frisch gemachten eintrag in die bücherliste zu stornieren, wenn wegen irgenwdas der im script folgende eintrag zum beispiel in die autorenliste nicht klappte?
    dann wäre http://www.zend.com/manual/function.mysql-insert-id.php sehr fein.



  • flenders schrieb:

    Könnte man das nicht auch direkt in einen Befehl schreiben (müsstest du ausprobieren 😉 ):

    DELETE FROM schnutzelfutz WHERE id = MAX(id)
    

    hmmm...

    solche Funktionen wie COUNT, NAX, MIN, ... müssen in SQL immer nach der SELECT-Anweisung stehen weil damit Datensätze "gruppiert" werden können. Ich könnte mir noch als alternative Lösung einen Sub-Select vorstellen:

    SELECT * FROM schnutzelfutz WHERE id in (SELECT MAX(id) FROM schnutzelfutz)
    -- ungetestet --
    

    MySQL macht das aber IMHO erst ab Version 4.



  • DELETE from WHERE MAX() ist bei einem DELETE nicht gültig.

    frage="SELECTFROMbuecherliste";frage = "SELECT * FROM buecherliste"; erg = mysql_query(frage);frage); anz = mysql_num_rows($erg);

    mag zwar die Anzahl der Datensätze liefern aber warum sollte man die DB damit belasten.

    ein

    SELECT count(*) from buecherliste;
    geht schneller und es wird die DB nicht belastet da die Anzahl in einer Variable von MYSQL gespeichert ist. SOmit muss die DB nicht durchgegangen werden sondern nur der Inhalt der Variable.
    Abgesehen davon da ein
    SELECT *
    sowieso nie verwenndet werden soll.



  • Ich habe mir eure Beiträge angeschaut und löse es jetzt so:

    $erg = mysql_query("SELECT MAX(id) FROM buecherliste");
    $num = mysql_fetch_row($erg);
    $erg = mysql_query("DELETE FROM buecherliste WHERE id=$num[0]");
    

    notabene: id steht als erstes Attribut in der Liste, daher num[0].

    PS
    ah ja, ist das eine Art goldene Regel, dass SELECT * nie verwendet werden soll? Hab ich noch gar nicht drüber nachgedacht. Thx.



  • Ein Select * soll nur dann nicht verwendet werden, wenn du nicht alle Datensätze brauchst. Wenn doch, dann isses natürlich ok. 😃



  • Es kann dann aber ggf. Probleme machen, falls du noch Spalten hinzufügst o.ä.
    Mit list(num)=mysql_fetch_row(num) = mysql\_fetch\_row(erg); hast du in $num direkt die Anzahl 😉
    Ob jetzt MAX(id) oder COUNT(*) schneller ist müsste man ausprobieren, weiß ich grad nicht 🙄



  • MAX() COUNT() können unterschiedliche Werte liefern.
    Ist somit nicht das selbe

    COUNT() ist denke ich auch schneller da sich MYSQL den letzten Wert der ID nicht merkt. Das merkt man daran, daß ein aufruf auf last_insert_id nur mit dem vorhandenen Handle funktioniert. Sobald man den Connect schließt ist der Wert weg.
    MYSQL kennt nur die Anzahl der Datensätze welche man mit count() bekommt.



  • 🙄 Logisch
    Dann wird er wohl MAX() brauchen, denn da er ja vorhat Datensätze zu löschen liefert COUNT() für ihn nach dem ersten Löschen ein für ihn nicht brauchbares Ergebnis 😉



  • Genau

    Allerdings fehlt noch die Antwort auf Volkard`s Frage.



  • Bin grad etwas durcheinander 😉
    Ja, das wäre wohl das allerbeste! Aber das war doch eher eine Aussage, als eine Frage - finde ich 🙄 - wenn, dann aber an C++arsten 😃



  • geht es zufällig darum, den frisch gemachten eintrag in die bücherliste zu stornieren

    Wenn dies zutrifft hat ja Volkard die Antwort schon gegeben



  • flenders schrieb:

    wenn, dann aber an C++arsten 😃

    ja, an C++arsten. ich warte immernoch auf die antwort.



  • Es ging mir nicht um den Wert (id) der letzten Einfügeoperation, sondern generell um den letzten Datensatz, z. B. nach mysql_close und erneutem Öffnen der DB. Daher ist mysql_insert_id zwar gut, aber nicht genau passend für mein Problem gewesen. Danke!


Anmelden zum Antworten