• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Begrenzte Anzahl von Datensätzen

noxx2

Neues Mitglied
(Erledigt) Begrenzte Anzahl von Datensätzen

Hallo.

Ich möchte das alle 10 Minuten per Cronjob ein Datensatz in meine mysql Datenbank eingelesen wird. In dieser Datenbank soll nur Werte der letzten 7 Tage gespeichert werden, was dann 1008 Datensätze sein würden.

Wenn der 1009te geschrieben wird, soll der erste gelöscht werden. Wie bekomme ich saß am besten hin? Kann man den Index auch neu durchprobieren lassen, das dann aus 2 eine 1 wird, aus 3 eine 2.... aus 1009 eine 1008?

Hintergrund ist der, das ich nicht weiß wieviel Datensätze so eine DB verträgt und wie langsam sie wird, wenn sie zu voll wird und ich Daten auslesen will.

Gruss
 
Zuletzt bearbeitet:
Werbung:
Speichere zu jedem Datensatz die Zeit und beschränkte das Delete-Statement auf eben diese Spalte. Beispiel:

Code:
DELETE FROM tabelle WHERE insertdate < DATE_SUB(NOW(), INTERVAL 7 DAYS)
 
Speichere zu jedem Datensatz die Zeit und beschränkte das Delete-Statement auf eben diese Spalte. Beispiel:

Code:
DELETE FROM tabelle WHERE insertdate < DATE_SUB(NOW(), INTERVAL 7 DAYS)

Ich habs jetzt noch nicht testen können, die Datenbank wird gerade erst vollgeschrieben. Zu jedem Datensatz schreibe die aktuelle datetime.

Frage noch, kann ich nach dem löschen der alten Daten auch denn Index neu durchnummerieren, so
das die Tabelle immer bei 0 beginnt?
 
Werbung:
Wenn Du mit "Index" eine Spalte mit Primärschlüssel, Spaltentyp INTEGER und auto_increment-Wert meinst, dann nein.
 
Nochmal zu dem Befehl, diesen kann ich einfach in mein *.php Script einfügen?

-> Vorletzte Zeile

PHP:
 <?php

////////////////////////////////////////////////////////////////
//            YOUR DATABASE DETAILS
////////////////////////////////////////////////////////////////

$databasehost = "DATABASE.INTERNAL.HOSTNAME.com";
$databasename = "YOUR_DATABASE_NAME";
$databasetable = "YOUR_DATABASE_TABLE";
$databaseusername ="DATABASE_LOGIN_NAME";
$databasepassword = "DATABASE_PASSWORD";

............


$con = mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error());
mysql_select_db($databasename) or die(mysql_error());
mysql_query("INSERT INTO $databasetable VALUES
('$array[0]','$array[1]','$array[2]','$array[3]','$array[4]','$array[5]','$array[6]','$array[7]','$array[8]','$array[9]','$array[10]') ") 
or die(mysql_error());  
echo "Data Inserted!";
mysql_query("DELETE FROM $databasetable WHERE insertdate < DATE_SUB(NOW(), INTERVAL 7 DAYS)");
mysql_close($con);


?>
 
Werbung:
Und was sagt mysql_error zu dieser Zeile??? Leute, bitte, das ist doch wohl das mindeste, was man selber einbauen sollte!
 
Beim ersten mysql_query hast du ein
PHP:
  or die(mysql_error());
Warum nicht auch beim zweiten???
 
Werbung:
du meinst

PHP:
mysql_query("DELETE FROM $databasetable WHERE insertdate < DATE_SUB(NOW(), INTERVAL 7 DAYS)") or die(mysql_error());

?

Ist der Code eigentlich so richtig?

 
Habe noch nicht viele Daten drin.... Deshalb meine Frage. Bin da etwas verunsichert, wegen fehlender Angabe zur Spalte wo das Datum steht (siehe Screenshot oben).
Irgendwie kommt mir das nicht richtig vor.
 
Werbung:
Mein Beispiel kann auch für dich nur stimmen, wenn Du auch eine Spalte insertdate vom Spaltentyp DATE oder DATETIME hast. Wenn Du keine solche Spalte hast, geht mein Beispiel-Statement bei dir nicht. Wenn Du eine solche Spalte hast, diese aber einen anderen Namen hast, musst Du mein Beispiel-Statement anpassen.
 
Werbung:
Befehl wird ausgeführt, keine Datensätze werden gelöscht. Bekomme nur einen Fehler
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DAYS)' at line 1
 
Werbung:
shit, nun habe ich die ganze tabelle gelöscht.... ;(
DELETE FROM meteohub_1 WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY)
 
Habs aber nun. Warum es erst nicht ging lag an der Syntax im 2ten Post. Da stand... 7 DAYS. Muss aber wohl 7 DAY heißen.
 
Zurück
Oben