rEd1Z1_2K
28-08-2007, 00:03
heyho,
in wie weit ist es möglich und wenn ja wie, das man aus einer tabelle alle alten datensätze löschen läst, bis auf die 1000 neuesten?
jemand ne idee?
penizillin
28-08-2007, 00:04
definiere "alter datensatz".
rEd1Z1_2K
28-08-2007, 00:06
naja mal angenommen ich hab ne tabelle mit ca 3000 datensätzen, einmal am tag möchte ich diese jetzt aufräumen so das nur die neusten 1000 übrig bleiben. (ID hat auto_increment) die anzahl der sich in der tabelle befindlichen datensätze varriert aber stark.
momentan lös ich das noch das pro neuer eintrag ein alter gelöscht wird, ist mir aber zu umständlich da ich nur einmal täglich dort aufräumen möchte.
ghostgambler
28-08-2007, 00:14
DELETE FROM tabelle WHERE id NOT IN (SELECT id FROM tabelle ORDER BY Datum DESC LIMIT 1000)
Ich glaub NOT IN ist aber nicht sonderlich performant ... müsste man mal ausprobieren, ansonsten eventuell mit php-Füller ein
LOCK TABLE tabelle
SELECT GROUP_CONCAT(id SEPARATOR ',') ids FROM tabelle ORDER BY Datum DESC LIMIT 1000;
DELETE FROM tabelle WHERE id NOT IN ($row['ids']);
UNLOCK TABLE tabelle
(ist nur pseudo-Code~)
ghostgambler
28-08-2007, 00:16
oder auch unsauber ein
DELETE FROM tabelle ORDER BY Datum DESC LIMIT 1000, 99999999
*zucks*
penizillin
28-08-2007, 00:21
die tägliche löschung bildet wohl in deinem fall keine zeitkritische angelegenheit, so kannst du etwas von ghostgambler vorschlägen nehmen, oder sogar die id des tausendsten eintrags ermitteln und alle ids größer dieser löschen (beachte die atomarität).
So wie es sich anhört ist deine 1000 nur ein willkürlicher Wert. Und wenn dein Autoincrement wenig Lücken beim Löschen aufweißt, kannst du ja auch alle ID < MAX-1000 löschen. Damit wäre das Löschen natürlich recht zügig.