Gustav Gans: 2 Timestamps

Moin!

Ich hab hier schon ein paar mal gelesen, daß bei jeder Änderung eines Datensatzes bei einer Mysql-datenbank sich der Timestamp mitaktualisiert und somit nicht mehr der Timestamp des Erstellungsdatums sondern jener des letzten Änderungsdatums in der DB steht. Als Lösung für dieses Problem wurde hier immer darauf verwiesen, man muß eben 2 Timestamp-Spalten anlegen, da bei zwei Timestamps nur der ERSTE geändert wird.

Ich hab das jetzt versucht. Die erste Zeile definiere ich so:

Feld: gb_lastedit
Typ: TIMESTAMP
Länge/Set:
Kollation:
Attribute:
Null: not null
Standard: Da habe ich das Kästchen "CURRENT_TIMESTAMP" aktiviert
Extra:
Kommentare:

Wenn ich das jetzt so anlege und speichere, funktioniert das problemlos, aber: Wenn ich jetzt ein ZWEITES Timestamp möchte und eine weitere Tabellenzeile mit folgenden Attributen anlegen will:

Feld: gb_made
Typ: TIMESTAMP
Länge/Set:
Kollation:
Attribute:
Null: not null
Standard: Da habe ich wieder das Kästchen "CURRENT_TIMESTAMP" aktiviert
Extra:
Kommentare:

dann kommt folgende Fehlermeldung:

ALTER TABLE 01\_gaestebuch\_gb1 ADD gb\_made TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

MySQL meldet: Dokumentation
#1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

Was muß ich also tun, wenn ich 2 Timestampfelder möchte, damit mir der ursprüngliche Erstellunszeitpunkt auch bei Datensatzveränderungen erghalten bleibt?

Gustav Gans

  1. Hallo

    Ich hab hier schon ein paar mal gelesen, daß bei jeder Änderung eines Datensatzes bei einer Mysql-datenbank sich der Timestamp mitaktualisiert und somit nicht mehr der Timestamp des Erstellungsdatums sondern jener des letzten Änderungsdatums in der DB steht. Als Lösung für dieses Problem wurde hier immer darauf verwiesen, man muß eben 2 Timestamp-Spalten anlegen, da bei zwei Timestamps nur der ERSTE geändert wird.

    Nein, das steht hier ganz bestimmt nicht *immer*. Es ist Unsinn. Es ist falsch. Es wird *nicht* *nur* der ERSTE geändert. Es wird die TIMESTAMP-Spalte geändert, bei der dies festgelegt ist, ich zitiere aus dem Handbuch. Die magische Funktionalität kann auch nicht über zwei verschiedene Spalten gehen:

    <zitat>
        For one TIMESTAMP column in a table, you can assign the current timestamp
        as the default value and the auto-update value. It is possible to have the
        current timestamp be the default value for initializing the column, for
        the auto-update value, or both. It is not possible to have the current
        timestamp be the default value for one column and the auto-update value
        for another column.

    Any single TIMESTAMP column in a table can be used as the one that is
        initialized to the current date and time, or updated automatically. This
        need not be the first TIMESTAMP column.
    </zitat>

    Worüber wunderst Du Dich?

    Was muß ich also tun, wenn ich 2 Timestampfelder möchte, damit mir der ursprüngliche Erstellunszeitpunkt auch bei Datensatzveränderungen erghalten bleibt?

    Eines der folgenden könnte genügen:

    • im INSERT-Statement den Erstellungszeitpunkt festhalten
    • im UPDATE-Statement den Updatezeitpunkt festhalten
    • einen INSERT-Trigger verwenden, der den Erstellungszeitpunkt festhält
    • einen UPDATE-Trigger verwenden, der den Updatezeitpunkt festhält
    • INSERT- oder UPDATE-Operationen nur über Stored Procedures durchführen,
        die die gewünschte Aktualisierung vornehmen
    • ein anderes DBMS verwenden, das Deiner Anforderung genügt ...

    Freundliche Grüße

    Vinzenz

    1. echo $begrüßung;

      • im INSERT-Statement den Erstellungszeitpunkt festhalten
      • im UPDATE-Statement den Updatezeitpunkt festhalten

      Dazu kann man ein ganz einfaches Datums- und/oder Zeitfeld verwenden (das nicht die Magie eines TIMESTAMP mitbringt), und bei den genannten Statements dieses Feld mit der Funktion NOW() befüllen.

      INSERT INTO table (feld, ...) VALUES (NOW(), ...)

      echo "$verabschiedung $name";

      1. Gudn!

        Dazu kann man ein ganz einfaches Datums- und/oder Zeitfeld verwenden (das nicht die Magie eines TIMESTAMP mitbringt), und bei den genannten Statements dieses Feld mit der Funktion NOW() befüllen.

        Verwende ich eigentlich auch viel lieber, allerdings

        INSERT INTO table (feld, ...) VALUES (NOW(), ...)

        mag ich diese Schreibweise nicht ;-)
        Ich verwende für alles SET.

        Gruß aus Fürth in Mittelfranken,
        Samoht

        --
        fl:| br:> va:) ls:< n4:( ss:) de:] js:| mo:}
        1. Hello,

          Verwende ich eigentlich auch viel lieber, allerdings

          INSERT INTO table (feld, ...) VALUES (NOW(), ...)

          mag ich diese Schreibweise nicht ;-)
          Ich verwende für alles SET.

          Das habe ich auch mal gesagt und mich dann an die Programmierung von Tools gemacht.
          Und da habe ich festgestellt, dass gerade bei PHP die obige Schreibweise ganz praktisch ist, wenn man die Feldliste und die Wertliste automatsich generieren lässt. Da reichen dann nämlich im einfachsten Fall ein array_keys() und zwei implodes(), um die Listen aufbauen zu können.

          Wenn man allerdings "Sonderfelder" dabei hat, die wegen ihres Typs nicht in Häkchen verpackt werden dürfen, dann wird es schon etwas aufwändiger, aber am Ende steht dann auch wieder das implode().

          Das bezieht sich natürlich jetzt auf die automatische Generierung der Schnittstelle.

          Wenn Du die Statements selber schreiben musst, dann stimme ich Dir mit SET zu. Das verhindert Fehler.
          Allerdings ist es wohl kein allgemeingültiges SQL.

          Ein harzliches Glückauf

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hallo Tom,

            Wenn Du die Statements selber schreiben musst, dann stimme ich Dir mit SET zu. Das verhindert Fehler.
            Allerdings ist es wohl kein allgemeingültiges SQL.

            welches DBMS unterstützt denn diese Syntax nicht?
            Mir ist kein (relevantes) bekannt.

            Freundliche Grüße

            Vinzenz

            1. echo $begrüßung;

              Wenn Du die Statements selber schreiben musst, dann stimme ich Dir mit SET zu. Das verhindert Fehler.
              Allerdings ist es wohl kein allgemeingültiges SQL.

              welches DBMS unterstützt denn diese Syntax nicht?
              Mir ist kein (relevantes) bekannt.

              Find ich auch, außer MySQL gibt es nichts relevantes :-)

              Die SET-Schreibweise ist beim UPDATE wohlbekannt, beim INSERT jedoch die Ausnahme. Der verlinkte Wikipedia-Artikel führt sie (derzeit) gar nicht an. Stichproben bei MS SQL (INSERT(Transact-SQL)), Oracle (INSERT Documentation) und PostgreSQL (INSERT Documentation) scheinen mir die Ausnahme zu bestätigen.

              echo "$verabschiedung $name";