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.
> Gibt es eine automatisierte Möglichkeit alle Werte, bis auf die letzten > 500 zu löschen? DELETE FROM adäquat parametrisieren. HTH
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?!
Die meisten Datenbanken bieten so etwas wie CREATE TRIGGER AFTER INSERT ...
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
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. |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.