2 Timestamps
Gustav Gans
- datenbank
0 Vinzenz Mai0 dedlfix0 Samoht0 Tom0 Vinzenz Mai0 dedlfix
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
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:
Freundliche Grüße
Vinzenz
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";
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
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
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
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";