Moin!
Gibt es die Möglichkeit per SQL jeden 2. Datensatz bedingungslos zu löschen?
Hintergrund: Ich logge unsere PV-Anlage alle 30 Sekunden, aber das doppelte Intervall würde reichen. Den logger kann ich einfach umstellen, ich würd halt die Tabellengröße gern halbieren.
Bedingungslos löschen deshalb, weil der logger vor allem anfangs nicht alle 30, sondern alle 33 Sekunden Einträge gemacht hat, daher gibt es manchmal nur einen Eintrag pro Minute.
Die Daten sind nach dem Timestamp (1. Spalte) sortiert vermute ich mal.
Gibt es in der Tabelle noch eine andere Spalte (z. B. ein Auto_increment Primary Key) in der Tabelle? Damit könnte man dann vielleicht eine einfachere Abhängigkeit für den DELETE erstellen, als mit dem Abstand der Timestamps voneinander.
Zeige doch mal
Code:
mysql>SHOW CREATE TABLE tabelle1
Grüße
Thomas
__________________ Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Ah, ok. Ja, das würde gehen, wenn tatsächlich die Sekunden immer '39' wären. Sind sie aber nur in dem Ausschnitt :-(
Hm, andere Idee mit PHP und einer while-Schleife:
Code:
$result = @mysql_query("SELECT * FROM `tabelle1` WHERE created BETWEEN '$start' AND '$end'") or die(mysql_error());
$rest=0;
while($row = mysql_fetch_object($result))
{
if($rest%2 == 0)
{
//Wie krieg ich den Datensatz in 'tabelle2' geschrieben? So:?
@mysql_query("INSERT INTO `tabelle2` '$row'");
}
$rest++;
}
Würde das so gehen? Wenn ja, dann ließe sich ja auch jeder n-te Datensatz löschen :-)
$result = @mysql_query("SELECT * FROM `tabelle1` WHERE created BETWEEN '$start' AND '$end'") or die(mysql_error());
$rest=0;
while($row = mysql_fetch_object($result))
{
if($rest%2 == 0)
{
// Hier müsste der DELETE hin
// mysql_query("DELETE ...'");
//Wie krieg ich den Datensatz in 'tabelle2' geschrieben? So:?
// mysql_query("INSERT INTO `tabelle2` (col1, col2, ...) VALUES ( ....");
}
$rest++;
}
Also im Prinzip ja, Du kannst mit Modulo so jeden 2. oder X. Datensatz finden.
a) Den DELETE nicht vergessen
b) Den INSERT Befehl mal im Handbuch nachschauen
c) Am Besten auf den @ vor den MySQL Befehlen verzichten, sonst bekommt Du keine Fehler mit.
d) Stichwort "Transaktion". Falls das Skript abbricht, kannst Du das so nicht beliebig wiederholen.
Grüße
Thomas
__________________ Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
ALTER TABLE `tabelle1` ADD `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;
3. Jede 2. Zeile löschen
Code:
DELETE FROM `tabelle1` WHERE id%2=0
4. Spalte id löschen
Code:
ALTER TABLE `tabelle1` DROP `id`
5. Primary key anlegen (created)
Code:
ALTER TABLE `tabelle1` ADD PRIMARY KEY ( `created` )
fertig.
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
Keine Angst, STRG-C/V sind mir zwar ein Begriff, aber zwischen C und V liegt noch mein Hirn ;-)
Und ich verwende zum Testen solchen Krams immer nur nicht mehr benötigte Tabellen und habe vom Original mindestens ein aktuelles Backup. Wenn da was schief geht macht es nichts.