Forum: PC-Programmierung [MySQL] FLUSH bis auf die letzen 500 rows


von Rene K. (xdraconix)


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 vom Autor gelöscht.
von g457 (Gast)


Lesenswert?

> Gibt es eine automatisierte Möglichkeit alle Werte, bis auf die letzten
> 500 zu löschen?

DELETE FROM adäquat parametrisieren.

HTH

von Rene K. (xdraconix)


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?!

von Ein Vorschlag (Gast)


Lesenswert?

Die meisten Datenbanken bieten so etwas wie CREATE TRIGGER AFTER INSERT 
...

von Gästin (Gast)


Lesenswert?

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

von Rene K. (xdraconix)


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.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


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).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.