phil: Pg/MySQL:nimm welche nicht älter sind als,lösche was älter ist

Hi.

Ist ein Query dieser Art möglich?

Gib mir alle Einträge dessen Timestamp nicht älter als AKTUELLERTIMESTAMP-2std. und lösche die anderen.

Mein Versuch wäre irgendwie:

SELECT x,y,z
FROM table
WHERE timestamp > NOW()-(2*3600000)

1. Wie kommt nun das DELETE noch mit rein?
2. Ich migriere gerade von MySQL auf PostgreSQL - also falls es da eher möglich ist dann sagt es mir ;).

Grüße, phil

  1. Hi,

    Ist ein Query dieser Art möglich?

    Gib mir alle Einträge dessen Timestamp nicht älter als AKTUELLERTIMESTAMP-2std. und lösche die anderen.

    Nein.

    Wie kommt nun das DELETE noch mit rein?

    Gar nicht.

    Selektieren und Löschen von Daten sind zwei gunrdverschiedene Operationen, die "gehören" nicht vermischt.

    Ob überhaupt etwas gelöscht werden muss, wäre erst mal zu überlegen.
    Datenbanken können mit sehr hohen Anzahlen von Datensätzen umgehen.

    Und wenn wirklich Löschbedarf besteht - dann überlegt man, wann man diesem nachkommt. Bspw. durch eine regelmässige Ausführung per Cronjob, die zu dem Zeitpunkt alles was älter als X ist, entfernt.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
  2. Hallo,

    Ist ein Query dieser Art möglich?

    Gib mir alle Einträge dessen Timestamp nicht älter als AKTUELLERTIMESTAMP-2std. und lösche die anderen.

    Klar.
    SELECT Deine_Prozedur_die_die_gewünschten_Daten_auswählt_und_die_anderen_löscht

    PL/pgSQL ist eine feine Sache.

    Freundliche Grüße

    Vinzenz

  3. Hallo,

    SELECT x,y,z
    FROM table
    WHERE timestamp > NOW()-(2*3600000)

    timestamp ist in PostgreSQL als Spaltenbezeichner erlaubt. Da timestamp in allen SQL-Spezifikationen ein reserviertes Wort ist, nähme ich timestamp nicht als Spaltenbezeichner.

    Bitte beachte, dass TIMESTAMP ein wunderbarer Datentyp ist, der mit UNIX-Timestamps herzlich wenig zu tun hat. In PostgreSQL schriebst Du, eine vernünftige Timestamp-Spalte vom Datentyp TIMESTAMP vorausgesetzt:

    SELECT  
        x,  
        y,  
        z  
    FROM  
        my_table  
    WHERE  
        my_timestamp_column > [link:http://www.postgresql.org/docs/8.4/static/functions-datetime.html#FUNCTIONS-DATETIME-TABLE@title=now()] - [link:http://www.postgresql.org/docs/8.4/static/functions-datetime.html#OPERATORS-DATETIME-TABLE@title=interval '2 hours']  
    
    

    Hast Du stattdessen Unix-Timestamps gespeichert, so schau Dir das Beispiel unter "epoch" im Handbuchabschnitt 9.9.1. EXTRACT, date_part an, wie Du daraus wieder vernünftige Timestamps machen kannst. Grundsätzlich halte ich es für eine gute Idee, mit den angemessenen Datentypen des Datenbankmanagementsystems zu arbeiten.

    Beachte ferner, dass in PostgreSQL Bezeichner mit doppelten Anführungszeichen gequotet werden (wie in vielen anderen SQL-Dialekten auch), beachte ferner, dass gequotete Bezeichner case-sensitiv sind, nicht gequotete jedoch nicht. Beachte den letzten Satz des von mir verlinkten Kapitels:

    <zitat>
        If you want to write portable applications you are advised to always
        quote a particular name or never quote it.
    </zitat>

    Wenn Du gerade von MySQL auf PostgreSQL migrierst, solltest Du eine mögliche weitere Migration im Hinterkopf behalten und diesen Ratschlag beherzigen.

    Freundliche Grüße

    Vinzenz