CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
05.10.2010, 09:38:11
|
Anfänger
|
|
Registriert seit: Oct 2010
Ort: 32***
Alter: 57
Beiträge: 10
|
|
DB verkleinern: jeden 2. Datensatz löschen
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.
Die Tabelle sieht so aus (Ausschnitt):
Code:
created kdy kmt kyr kt0 tnf tkk pac prl il1 idc ul1 udc sys
2010-09-12 08:25:39 3 194 639 639 5001 25 371 5 156 122 2339 3398 20008
2010-09-12 08:26:09 3 194 639 639 5000 25 389 5 165 124 2337 3445 20008
2010-09-12 08:26:39 3 194 639 639 5000 25 395 5 165 128 2346 3422 20008
2010-09-12 08:27:09 3 194 639 639 5003 25 408 6 170 131 2343 3412 20008
2010-09-12 08:27:39 3 194 639 639 5001 25 421 6 175 135 2349 3397 20008
2010-09-12 08:28:09 3 194 639 639 5000 25 432 6 181 138 2328 3417 20008
2010-09-12 08:28:39 3 194 639 639 5000 25 437 6 182 143 2337 3410 20008
2010-09-12 08:29:10 3 194 639 639 5001 25 453 6 189 144 2343 3463 20008
2010-09-12 08:29:39 3 194 639 639 5002 25 470 7 196 149 2341 3452 20008
2010-09-12 08:30:09 3 194 639 639 5001 25 486 7 202 154 2339 3433 20008
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.
Gruß
lasser
|
05.10.2010, 13:10:13
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: DB verkleinern: jeden 2. Datensatz löschen
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.
|
05.10.2010, 13:23:07
|
Anfänger
|
|
Registriert seit: Oct 2010
Ort: 32***
Alter: 57
Beiträge: 10
|
|
AW: DB verkleinern: jeden 2. Datensatz löschen
Moin!
ok, das sieht wie folgt aus:
Code:
CREATE TABLE `log` (
`created` timestamp NOT NULL default CURRENT_TIMESTAMP,
`kdy` int(11) NOT NULL default '0',
`kmt` int(11) NOT NULL default '0',
`kyr` int(11) NOT NULL default '0',
`kt0` int(11) NOT NULL default '0',
`tnf` int(11) NOT NULL default '0',
`tkk` int(11) NOT NULL default '0',
`pac` int(11) NOT NULL default '0',
`prl` int(11) NOT NULL default '0',
`il1` int(11) NOT NULL default '0',
`idc` int(11) NOT NULL default '0',
`ul1` int(11) NOT NULL default '0',
`udc` int(11) NOT NULL default '0',
`sys` int(11) NOT NULL default '0',
PRIMARY KEY (`created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Gruß
lasser
|
05.10.2010, 13:57:00
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: DB verkleinern: jeden 2. Datensatz löschen
Also ich mache "...jeden zweiten Datensatz löschen.." einfach an der Sekunde fest. Z.b. ":39". Die Suche wäre dann einfach so
Code:
SELECT DATE_FORMAT(created,'%s'), created FROM log
WHERE DATE_FORMAT(created,'%s') = '39' ;
Wenn dass stimmt, dann geht das löschen z.B. so..
Code:
DELETE FROM log
WHERE DATE_FORMAT(created,'%s') = '39' ;
Anschließend noch die Tabelle optimieren, sonst wird diese nicht "kleiner" was den Plattenplatz angeht.
Code:
ANALYZE TABLE log;
OPTIMIZE TABLE log;
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
05.10.2010, 14:35:24
|
Anfänger
|
|
Registriert seit: Oct 2010
Ort: 32***
Alter: 57
Beiträge: 10
|
|
AW: DB verkleinern: jeden 2. Datensatz löschen
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 :-) Gruß
lasser
|
05.10.2010, 14:56:57
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: DB verkleinern: jeden 2. Datensatz löschen
Zitat:
Zitat von lasser
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)
{
// 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.
|
06.10.2010, 07:15:13
|
Member
|
|
Registriert seit: Nov 2007
Beiträge: 843
|
|
AW: DB verkleinern: jeden 2. Datensatz löschen
Hi,
das geht auch mit mysql.
1. Primary key löschen (created)
Code:
ALTER TABLE `tabelle1` DROP PRIMARY KEY
2. Spalte id Primary auto increment erstellen
Code:
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!
|
06.10.2010, 08:04:03
|
Anfänger
|
|
Registriert seit: Oct 2010
Ort: 32***
Alter: 57
Beiträge: 10
|
|
[GELÖST]: DB verkleinern: jeden 2. Datensatz löschen
Moin!
Code:
ALTER TABLE `tabelle1` DROP PRIMARY KEY;# Betroffene Datensätze: 681
ALTER TABLE `tabelle1` ADD `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;# Betroffene Datensätze: 681
DELETE FROM `tabelle1` WHERE id%2=0;# Betroffene Datensätze: 340
ALTER TABLE `tabelle1` DROP `id`;# Betroffene Datensätze: 341
ALTER TABLE `tabelle1` ADD PRIMARY KEY ( `created` );# Betroffene Datensätze: 341
Vielen Dank! Das klappt hervorragend!
Gruß
lasser
|
06.10.2010, 13:13:17
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: DB verkleinern: jeden 2. Datensatz löschen
Zitat:
Zitat von Ckaos
Hi,
das geht auch mit mysql.
1. Primary key löschen (created)
Code:
ALTER TABLE `tabelle1` DROP PRIMARY KEY
...
|
Du greifst zwar heftig in eine fremde Tabellenstruktur ein, aber stimmt, so geht es auch.
Sehr gute Idee.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|
06.10.2010, 14:21:12
|
Anfänger
|
|
Registriert seit: Oct 2010
Ort: 32***
Alter: 57
Beiträge: 10
|
|
AW: DB verkleinern: jeden 2. Datensatz löschen
Moin!
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.
Gruß
lasser
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 06:54:31 Uhr.
|