dedlfix: Anzahl der Einträge einer MySQL-Tabelle kürzen

Beitrag lesen

Tach!

Haben diese hundert Datensätze ein Identifizierungsmerkmal? Dann lösche alle Datensätze, deren ID NOT IN (deine select-abfrage mit ID statt * als subquery).
Nein, kein eindeutiges Merkmal nur eben die 100 aktuellsten ...

Selbst mein erster Vorschlag funktioniert so nicht, denn es ist nicht möglich, in einer Tabelle gleichzeitig Datensätze zu löschen und ebendiese Tabelle als Subquery anzugeben. In einem Zuge geht das also auf keinen Fall, wenn sich die Selektionsbedingung nicht in einfachen Ausdrücke formulieren lässt. Auch LIMIT ist hier nicht verwendbar.

Ich würde nun versuchen, die "Datümer" der nach Datum absteigend sortierten und auf 100 limitierten Datensätze in einer temporären Tabelle zwischenzulagern und anschließend wie oben vorgeschlagen eine DELETE aber Datum statt ID und die temporäre Tabelle als Subquery zu verwenden. Dann kann es zwar vorkommen, dass ein paar Datensätze mehr oder weniger bleiben, aber die 100 war vermutlich nur ein Richtwert und keine exakte Bedingung.

Ein anderer Versuch wäre, das Datum des ältesten noch zu behaltenden Datensatzes zu ermitteln und alles ältere zu löschen. Der erste Teil sollte mit LIMIT 100,1 funktionieren.

Weiterhin wäre möglich, eine Abfrage über alle Datensätze absteigend sortiert und auf 100 limitiert in einem CREATE TABLE neue SELECT ... anzugeben, um so eine neue Tabelle zu erstellen und die andere dann zu löschen. Gegebenenfalls nachher die neue in den alten Namen umbenennen. Das kann aber Nebenwirkungen haben, weil das kein atomarer (einteiliger) Vorgang ist.

Alle Versuche stehen oder fallen aber mit der Qualität der Datumsangaben. Wenn da viele Datensätze mit demselben Datums- oder Datums-Zeit-Wert drinstehen wirst du die 100 nur mit dem letzten Vorschlag genau treffen. Wobei dann aber die Uneindeutigkeit bei der Sortierung nicht gerade hilfreich ist.

dedlfix.