MySQL 5: CURRENT_TIMESTAMP

simcen
RSAC
Posts: 338
Joined: 2003-02-12 14:35
Location: Bern, Schweiz

MySQL 5: CURRENT_TIMESTAMP

Post by simcen »

Hallo Zusammen

Ich habe folgende Tabellenstruktur erstellt:

Code: Select all

CREATE TABLE `nets_cl` (
  `id` mediumint(9) NOT NULL auto_increment,
  `rectime` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `msgtime` timestamp NOT NULL default '0000-00-00 00:00:00',
  `hostname` varchar(30) default NULL,
  `cell` varchar(50) default NULL,
  `nodename` varchar(50) default NULL,
  `appserver` varchar(50) default NULL,
  `log` varchar(30) default NULL,
  `msg` text,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;
Ich verwende momentan MySQL 5.0.24a.
Seltsamerweise wird bei einem INSERT die Spalte 'rectime' nicht mit dem Timestamp gefüllt sondern erhält den Wert '0000-00-00 00:00:00'.
Auf einem MySQL 4.1.20 hat dies aber noch bestens funktioniert.

Weis jemand ob ich was falsch mache oder ob das mit dem 5er gar nicht mehr geht?

Gruss und Danke für die Hilfe
Simon

[edit]
Habe die Syntax anhand http://dev.mysql.com/doc/refman/5.1/en/ ... p-4-1.html überprüft. Ok, es ist kompliziert, aber ich meine ich habs richtig gemacht?!
[/edit]
Top

User avatar
Joe User
Project Manager
Project Manager
Posts: 11519
Joined: 2003-02-27 01:00
Location: Hamburg

Re: MySQL 5: CURRENT_TIMESTAMP

Post by Joe User »

http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html wrote:NOW()

Returns the current date and time as a value in 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS format, depending on whether the function is used in a string or numeric context.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
Top

simcen
RSAC
Posts: 338
Joined: 2003-02-12 14:35
Location: Bern, Schweiz

Re: MySQL 5: CURRENT_TIMESTAMP

Post by simcen »

Jo, da steht aber auch:
CURRENT_TIMESTAMP, CURRENT_TIMESTAMP()
CURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms for NOW().
Meinst du das geht nicht mit "timestamp" als Feld?
Top

User avatar
Joe User
Project Manager
Project Manager
Posts: 11519
Joined: 2003-02-27 01:00
Location: Hamburg

Re: MySQL 5: CURRENT_TIMESTAMP

Post by Joe User »

Oops, ich dachte Dir ging es ums Format :?

Nun muss ich ersteinmal selbst nachlesen ;)
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
Top

User avatar
Joe User
Project Manager
Project Manager
Posts: 11519
Joined: 2003-02-27 01:00
Location: Hamburg

Re: MySQL 5: CURRENT_TIMESTAMP

Post by Joe User »

Funktioniert es wenn Du 'NOT NULL' bei beiden Timestamp-Rows weglässt?
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
Top

simcen
RSAC
Posts: 338
Joined: 2003-02-12 14:35
Location: Bern, Schweiz

Re: MySQL 5: CURRENT_TIMESTAMP

Post by simcen »

Joe User wrote:Funktioniert es wenn Du 'NOT NULL' bei beiden Timestamp-Rows weglässt?
Nein - hat nichts gebracht.
msgtime wird übrigens korrekt geschrieben, da ich ein timestamp aus einem Log-File parse und mit im INSERT drin habe.
Top

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: MySQL 5: CURRENT_TIMESTAMP

Post by daemotron »

Ich meine mich zu erinnern, dass Du beim Datentyp "TIMESTAMP" gar nichts angeben brauchst - da wird automatisch die aktuelle Zeit gesetzt. Wenn Du mit DEFAULT arbeiten willst, musst Du IMHO den Datentyp "DATETIME" verwenden... (vorausgesetzt, Du hast MySQL nicht als MaxDB laufen)
Top

simcen
RSAC
Posts: 338
Joined: 2003-02-12 14:35
Location: Bern, Schweiz

Re: MySQL 5: CURRENT_TIMESTAMP

Post by simcen »

Hallo jfreund

Du hast recht, mit timestamp wird eigentlich schon das aktuelle Datum gesetzt.
Allerdings ermöglicht ein ON UPDATE bei jedem INSERT und UPDATE des Datensatzes dass der aktuelle Zeitstempel gesetzt wird. So muss sich das Programm nicht darum kümmern.
Die zweite Aussage stimmt gemäss MySQL Dokumentation auch nicht. Es hat dort einige Beispiele, welche das widerlegen.

Was aber ein gutes Stichwort war: MaxDB. Habe dazu folgenden Absatz im Manual gelesen:
(http://dev.mysql.com/doc/refman/5.0/en/ ... p-4-1.html)
The MySQL server can be also be run with the MAXDB SQL mode enabled. When the server runs with this mode enabled, TIMESTAMP is identical with DATETIME. That is, if this mode is enabled at the time that a table is created, TIMESTAMP columns are created as DATETIME columns. As a result, such columns use DATETIME display format, have the same range of values, and there is no automatic initialization or updating to the current date and time.
Heisst das, wenn ich kein MaxDB verwende, dass automatische Updates (ON UPDATE) nicht möglich sind?
Top

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: MySQL 5: CURRENT_TIMESTAMP

Post by daemotron »

Ich verstehe das umgekehrt - wenn der Server als MaxDB läuft, verhalten sich Felder vom Typ TIMESTAMP genau wie Felder vom Typ DATETIME - es finden also keine automatischen Updates statt. Wenn Du die Komfort-Funktionalität nutzen willst, darfst Du also den MySQL nicht als MaxDB laufen lassen...
Top

simcen
RSAC
Posts: 338
Joined: 2003-02-12 14:35
Location: Bern, Schweiz

Re: MySQL 5: CURRENT_TIMESTAMP

Post by simcen »

Okay, habs nochmals durchgelesen ;) Bin auch deiner Meinung.
Hätte mich auch sehr gewundert...

Nunja, fakt ist, ich verwende kein MaxDB und das Problem existiert immer noch.
Hab jetzt auf einer anderen Maschine einen 4.1er aufgesetzt und seltsamerweise läufts auch da nicht (mehr). Sehr suspekt... Muss mir morgen dass Skript anschauen, vielleicht mache ich da was verkehrt.

Melde mich :)
Top

User avatar
daemotron
Administrator
Administrator
Posts: 2800
Joined: 2004-01-21 17:44

Re: MySQL 5: CURRENT_TIMESTAMP

Post by daemotron »

Vielleicht hilft Dir das noch weiter:
11.3.1.1. TIMESTAMP-Eigenschaften ab MySQL 4.1 wrote:In einer CREATE TABLE-Anweisung kann die erste TIMESTAMP-Spalte auf eine der folgenden Weisen deklariert werden:
  • Wenn sowohl DEFAULT CURRENT_TIMESTAMP- als auch ON UPDATE CURRENT_TIMESTAMP-Klauseln vorhanden sind, dann hat die Spalte den aktuellen Zeitstempel als Vorgabewert und wird automatisch aktualisiert.
  • Fehlen sowohl DEFAULT- als auch ON UPDATE-Klausel, dann ist dies das Gleiche wie DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
IMHO sieht Deine CREATE TABLE-Statement also richtig aus... Hast Du mal mit

Code: Select all

DESCRIBE nets_cl
überprüft, ob alle Angaben aus dem CREATE TABLE Statement richtig übernommen wurden? Hast Du mal probiert, ob es vielleicht an der Engine liegt? Funktioniert es nur nicht bei einem Insert aus der Applikation oder geht auch ein Insert mit MySQL CLI in die Hose?
Top

simcen
RSAC
Posts: 338
Joined: 2003-02-12 14:35
Location: Bern, Schweiz

Re: MySQL 5: CURRENT_TIMESTAMP

Post by simcen »

So, ich hab den Bock gefunden:

Bei meinem INSERT-Statement versuchte ich den timestamp in 'rectime' selber zu setzen, schon im korrekten Format , aber MySQL mochte das irgendwie nicht.
Da sich die Spalte bei jedem INSERT und UPDATE selber kümmert, habe ich aus dem Statement die Spalte rectime einfach weggelassen.
Das war sowieso mein Ziel ;) Allerdings bin ich noch nicht glücklick, weil ich nicht ich nicht weis, wieso es nicht geht.

Ich glaube, dass ich den Bock noch hier suchen muss:
  • Wird ein DEFAULT-Wert für die erste TIMESTAMP-Spalte in einer Tabelle festgelegt, so wird dieser nicht ignoriert. Als Vorgabe kann CURRENT_TIMESTAMP oder ein konstanter Wert für Datum und Uhrzeit verwendet werden.
  • DEFAULT NULL ist bei der ersten TIMESTAMP-Spalte dasselbe wie DEFAULT CURRENT_TIMESTAMP. Bei jeder anderen TIMESTAMP-Spalte hingegen wird DEFAULT NULL als DEFAULT 0 behandelt.
  • Jede einzelne TIMESTAMP-Spalte in einer Tabelle kann als diejenige benutzt werden, die mit dem aktuellen Zeitstempel initialisiert oder automatisch aktualisiert wird.
  • In einer CREATE TABLE-Anweisung kann die erste TIMESTAMP-Spalte auf eine der folgenden Weisen deklariert werden:
  • Wenn sowohl DEFAULT CURRENT_TIMESTAMP- als auch ON UPDATE CURRENT_TIMESTAMP-Klauseln vorhanden sind, dann hat die Spalte den aktuellen Zeitstempel als Vorgabewert und wird automatisch aktualisiert.
  • Fehlen sowohl DEFAULT- als auch ON UPDATE-Klausel, dann ist dies das Gleiche wie DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP.
  • Mit DEFAULT CURRENT_TIMESTAMP-, aber ohne ON UPDATE-Klausel hat die Spalte den aktuellen Zeitstempel als Vorgabewert, wird jedoch nicht automatisch aktualisiert.
  • Ohne DEFAULT-, aber mit ON UPDATE CURRENT_TIMESTAMP-Klausel hat die Spalte den Standardwert 0 und wird automatisch aktualisiert.
  • Bei einem konstanten DEFAULT-Wert erhält die Spalte den angegebenen Standardwert. Wenn die Spalte eine ON UPDATE CURRENT_TIMESTAMP-Klausel hat, wird sie automatisch aktualisiert, andernfalls nicht.
Top