[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 #6956169
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 #6956197
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) #6956380
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren