Jenny Rheingoal: MySql: alle Datenbnk Einträge löschen (bis auf die ersten 30!)

Hallo ihr lieben!

Ich würde meine MySQL Datenbank gerne automatisiert aufräumen hab allerdings nicht den richtigen Query, damit >> die letzten 30 Einträge sortiert nach Datum erhalten bleiben <<:

ich dachte mir sowas wie:
DELETE FROM table ORDER BY time DESC LIMIT 30, 100000

^^ funktioniert leider nicht...

wer kanns besser?
würde mich riesig über einen Tipp, eine Lösung oder ein Workaround freuen!

herzlichen Dank!!
J. Rheingoal

  1. Hi!

    Soo bewandert bin ich mit der MySQL-Syntax auch nicht. Aber wie wärs denn damit:

    Erst den dreissigsten Eintrag (nach Datum geordnet) auslesen, und dann alles löschen, was älter als das ausgelesene Datum ist.

    Viele Grüße,
    Benni

  2. Halihallo Jenny

    Ich würde meine MySQL Datenbank gerne automatisiert aufräumen hab allerdings nicht den richtigen Query, damit >> die letzten 30 Einträge sortiert nach Datum erhalten bleiben <<:

    1. Erstelle eine HEAP-Tabelle und speichere dort die ersten 30
         Einträge mittels REPLACE INTO. Dann lösche die alte Tabelle
         mittels DELETE FROM oldtable und speichere alle Daten der HEAP-
         Tabelle wieder in der alten Tabelle.
         http://www.mysql.com/doc/en/HEAP.html
         http://www.mysql.com/doc/en/REPLACE.html
    2. SELECT time FROM table ORDER BY time ASC LIMIT 29,1
         DELETE FROM table WHERE time>"vorherige time in SELECT-Statement"
         Beachte aber, dass dies - falls time kein PRIMARY KEY ist - nur
         eine approximative Lösung ist, da ja theoretisch jede time den
         selben Wert haben kann und somit gar keine Datensätze gelöscht
         werden würden. Oder besser:
    3. MySQL>4.x :
         DELETE FROM table WHERE id NOT IN (
            SELECT id FROM table ORDER BY time ASC LIMIT 30
         )
    4. Nun ja, falls es denn nur 30 Datensätze sind: Lies sie doch
         einfach über eine 4GL-Sprache deiner Wahl aus, lösche die Tabelle
         und füge die vorher ausgelesenen wieder ein...

    Eine schöne Lösung kann ich nicht finden (nun, die 4 gefällt mir,
    hängt jedoch von der Version des MySQL-Systems ab)...

    Zusatz: Arbeite bei derartigen Geschichten und Workarounds _immer_
            mit Table-LOCK, sonst gibts irreparablen Datenverlust!

    ich dachte mir sowas wie:
    DELETE FROM table ORDER BY time DESC LIMIT 30, 100000
    ^^ funktioniert leider nicht...

    Dann _immer_ Fehler + Version angeben!

    Viele Grüsse

    Philipp