SELFPHP: Version 5.8.1 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Webseiten professionell erstellen

Webseiten professionell erstellen zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Deine Leidenschaft ist die Unterwasserfoto-grafie?


Dann ist Qozido genau das Richtige für Dich!

Die Bilderverwaltung mit Logbuch für Taucher und Schnorchler ist da!

www.qozido.de

 


Zurück   PHP Forum > SELFPHP > MySQL

MySQL Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQL diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 05.10.2010, 10:38:11
lasser lasser ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 8
lasser befindet sich auf einem aufstrebenden Ast
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
Mit Zitat antworten
  #2  
Alt 05.10.2010, 14:10:13
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 4
Beiträge: 395
thomas_w befindet sich auf einem aufstrebenden Ast
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.
Mit Zitat antworten
  #3  
Alt 05.10.2010, 14:23:07
lasser lasser ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 8
lasser befindet sich auf einem aufstrebenden Ast
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
Mit Zitat antworten
  #4  
Alt 05.10.2010, 14:57:00
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 4
Beiträge: 395
thomas_w befindet sich auf einem aufstrebenden Ast
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.
Mit Zitat antworten
  #5  
Alt 05.10.2010, 15:35:24
lasser lasser ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 8
lasser befindet sich auf einem aufstrebenden Ast
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 :-)
Code:
if($rest%n == 0)
Gruß
lasser
Mit Zitat antworten
  #6  
Alt 05.10.2010, 15:56:57
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 4
Beiträge: 395
thomas_w befindet sich auf einem aufstrebenden Ast
AW: DB verkleinern: jeden 2. Datensatz löschen

Zitat:
Zitat von lasser Beitrag anzeigen
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.
Mit Zitat antworten
  #7  
Alt 06.10.2010, 08:15:13
Ckaos Ckaos ist offline
Member
 
Registriert seit: Nov 2007
Beiträge: 799
Ckaos befindet sich auf einem aufstrebenden Ast
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!
Mit Zitat antworten
  #8  
Alt 06.10.2010, 09:04:03
lasser lasser ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 8
lasser befindet sich auf einem aufstrebenden Ast
[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
Mit Zitat antworten
  #9  
Alt 06.10.2010, 14:13:17
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 4
Beiträge: 395
thomas_w befindet sich auf einem aufstrebenden Ast
AW: DB verkleinern: jeden 2. Datensatz löschen

Zitat:
Zitat von Ckaos Beitrag anzeigen
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.
Mit Zitat antworten
  #10  
Alt 06.10.2010, 15:21:12
lasser lasser ist offline
Anfänger
 
Registriert seit: Oct 2010
Beiträge: 8
lasser befindet sich auf einem aufstrebenden Ast
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
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Datensatz per link löschen Extremefall PHP Grundlagen 4 02.01.2010 17:17:32
Bilder aus Ordner löschen + passenden Datensatz (MySql) Auf der Mauer MySQL 15 25.07.2009 15:21:23
1. Datensatz aus Tabelle löschen mc-bain MySQL 1 03.07.2008 14:09:55
MYSQL Datensatz verschieben und löschen Schnoop PHP für Fortgeschrittene und Experten 6 21.01.2004 17:50:42
Einen bestimten Datensatz löschen? Scope PHP für Fortgeschrittene und Experten 6 28.04.2002 15:52:50


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:01:47 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.


© 2001-2014 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt