[MySQL] FLUSH bis auf die letzen 500 rows

OP #6956157
Lesenswert?
• ▲
▼
Ich habe Tabelle in denen ich regelmäßig Werte abspeichere. Ich brauche 
/ möchte aber ausschließlich auf die letzten 500 gespeicherten Werte 
zugreifen. Die vorigen brauche ich nicht.

Gibt es eine automatisierte Möglichkeit alle Werte, bis auf die letzten 
500 zu löschen?
Beitrag #6956158 wurde von einem Moderator gelöscht.
OP
Lesenswert?
• ▲
▼
g457 schrieb:
>> Gibt es eine automatisierte Möglichkeit alle Werte, bis auf die
> letzten
>> 500 zu löschen?
>
> DELETE FROM adäquat parametrisieren.
>
> HTH

Jap, dies hab ich ja schon, in etwa so:
1
DELETE FROM `data`
2
WHERE id NOT IN (
3
  SELECT id
4
  FROM (
5
    SELECT id
6
    FROM `data`
7
    ORDER BY id DESC
8
    LIMIT 500
9
  ) foo
10
);

Aber diese Abfrage müsste ich ja manuell starten, bzw. über Cronjob 
semi-manuell anstarten. Gibt es da eine Möglichkeit dies zu 
automatiesieren sobald ein ein neuer Insert in die Datenbank kommt?!
OP
Lesenswert?
• ▲
▼
Gästin schrieb:
> Grundsätzlich per Trigger [1]. MySQL kennt aber leider nur
> Row-Level
> Trigger und keine per Statement, so dass der Trigger für jede eingefügte
> Zeile ausgeführt wird.
>
> [1] https://dev.mysql.com/doc/refman/8.0/en/create-trigger.html

Trigger war ein guter Ansatz, habe ich angelegt. Nun ist aber das 
Problem das ich - logischerweise - ein MySQL Fehler geworfen bekomme da 
ich ja einen Trigger auslöße während er schreibt.

Trigger:
1
 
2
CREATE 
3
  DEFINER=`draconix`@`localhost` 
4
  TRIGGER `Log500` 
5
  AFTER INSERT 
6
  ON `Log` 
7
  FOR EACH ROW 
8
    DELETE FROM Log 
9
    WHERE id NOT IN 
10
    ( SELECT id FROM ( SELECT id FROM Log ORDER BY id DESC LIMIT 20 ) foo )

Beim INSERT INTO eines neuen Datensatzes wirft er diesen Fehler:
1
DatabaseError: 1442 (HY000): Can't update table 'Log' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
(Firma: Funkenflug Industries)
Lesenswert?
• ▲
▼
Performance-Killer, das immer gleich in Echtzeit zu löschen. Lieber ein 
paar Stunden/Tage länger in der Tabelle lassen, danach alles löschen was 
man nicht braucht und ein optimize table hinterher (wobei das optimize 
auf große Tabellen auch die Performance killen kann, dann sollte man 
sowas in zugriffsschwache Zeiten legen).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.