Hinweis: Bei älteren
MySQL-Versionen (vor 4.1) unterscheiden sich die Eigenschaften
des Datentyps TIMESTAMP
erheblich von dem,
was in diesem Abschnitt beschrieben wurde. Wenn Sie ältere
TIMESTAMP
-Daten konvertieren müssen, damit
sie in MySQL 5.1 funktionieren, lesen Sie in
jedem Fall die einschlägigen Abschnitte im
MySQL-Referenzhandbuch für die Versionen 3.23, 4.0
und 4.1.
TIMESTAMP
-Spalten werden im selben Format
angezeigt wie DATETIME
-Spalten. Mit anderen
Worten ist die Anzeigebreite auf 19 Zeichen festgesetzt, und
das Format lautet YYYY-MM-DD HH:MM:SS
.
Der MySQL Server kann auch mit aktiviertem SQL-Modus
MAXDB
laufen. Wenn am Server dieser Modus
aktiv ist, ist TIMESTAMP
mit
DATETIME
identisch. Das bedeutet, dass,
wenn dieser Modus zum Zeitpunkt der Erstellung einer Tabelle
aktiviert ist, TIMESTAMP
-Spalten als
DATETIME
-Spalten erstellt werden. Aufgrund
dessen verwenden solche Spalten das
DATETIME
-Anzeigeformat und haben denselben
Wertebereich, und es gibt keine automatische Initialisierung
oder Aktualisierung auf die aktuellen Werte für Datum und
Uhrzeit.
Um den Modus MAXDB
zu aktivieren, setzen
Sie entweder den SQL-Modus des Servers beim Start mit der
Serveroption --sql-mode=MAXDB
auf
MAXDB
, oder Sie stellen die globale
Variable sql_mode
zur Laufzeit ein:
mysql> SET GLOBAL sql_mode=MAXDB;
Ein Client kann den Server auch so einstellen, dass die eigene
Verbindung im MAXDB
-Modus läuft:
mysql> SET SESSION sql_mode=MAXDB;
Beachten Sie, dass die Informationen im nachfolgenden
Abschnitt nur für TIMESTAMP
-Spalten in
solchen Tabellen gelten, die nicht mit
MAXDB
als aktivem Modus erstellt wurden,
weil solche Spalten als DATETIME
-Spalten
erstellt werden.
MySQL akzeptiert keine Zeitstempelwerte, die eine Null in der
Tages- oder Monatsspalte oder andere Werte enthalten, die kein
gültiges Datum darstellen. Die einzige Ausnahme dieser Regel
ist der Sonderwert '0000-00-00 00:00:00'
.
Bei der Bestimmung, wann die automatische
TIMESTAMP
-Initialisierung und
-Aktualisierung erfolgen soll und welche Spalten dieses
Verhalten aufweisen sollen, verfügen Sie über ausgesprochen
viel Flexibilität:
Für eine TIMESTAMP
-Spalte in einer
Tabelle können Sie den aktuellen Zeitstempel als
Standardwert und Wert für die automatische Aktualisierung
angeben. Es ist möglich, den aktuellen Zeitstempel als
Vorgabewert für die Initialisierung der Spalte und/oder
als Wert für die automatische Aktualisierung zu
verwenden. Es ist jedoch nicht möglich, den aktuellen
Zeitstempel als Vorgabewert für eine Spalte und als Wert
für die automatische Aktualisierung einer anderen Spalte
zu verwenden.
Sie können festlegen, welche
TIMESTAMP
-Spalte sich automatisch
initialisieren oder auf die aktuellen Werte für Datum und
Uhrzeit setzen soll. Dies muss nicht unbedingt die erste
TIMESTAMP
-Spalte sein.
Die folgenden Regeln bestimmen die Initialisierung und
Aktualisierung von TIMESTAMP
-Spalten:
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.
Anders gesagt: Sie können den aktuellen Zeitstempel
sowohl als Initialisierungs- als auch als
Aktualisierungswert, als einen dieser beiden Werte oder
gar nicht verwenden. (So können Sie beispielsweise
ON UPDATE
angeben, um die automatische
Aktualisierung zu aktivieren, ohne dass die Spalte
automatisch initialisiert werden müsste.)
CURRENT_TIMESTAMP
,
CURRENT_TIMESTAMP()
und
NOW()
können gleichermaßen in
DEFAULT
- und ON
UPDATE
-Klauseln verwendet werden. Sie alle haben
die Bedeutung „aktueller Zeitstempel“.
Die Reihenfolge der DEFAULT
- und
ON UPDATE
-Attribute ist unerheblich.
Wenn sowohl DEFAULT
als auch
ON UPDATE
für eine
TIMESTAMP
-Spalte angegeben werden, kann
das eine Attribut vor oder hinter dem anderen stehen. So
sind beispielsweise die folgenden Anweisungen
gleichwertig:
CREATE TABLE t (ts TIMESTAMP); CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Um für eine andere als die erste
TIMESTAMP
-Spalte die automatische
Initialisierung oder Aktualisierung festzulegen, müssen
Sie dieses Verhalten für die erste
TIMESTAMP
-Spalte unterdrücken. Dies
tun Sie, indem Sie ihr explizit einen konstanten
DEFAULT
-Wert zuweisen (z. B.
DEFAULT 0
oder DEFAULT
'2003-01-01 00:00:00'
). Nachfolgend gelten für
die andere TIMESTAMP
-Spalte dieselben
Regeln wie für die erste; die einzige Ausnahme besteht
darin, dass, wenn Sie sowohl DEFAULT
als auch ON UPDATE
weglassen, keine
automatische Initialisierung oder Aktualisierung erfolgt.
So sind beispielsweise die folgenden Anweisungen gleichwertig:
CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Sie können die aktuelle Zeitzone für jede Verbindung separat
einstellen (siehe Beschreibung in
Abschnitt 5.11.8, „Zeitzonen-Unterstützung des MySQL-Servers“).
TIMESTAMP
-Werte werden in UTC gespeichert;
zur Speicherung werden sie aus der aktuellen Zeitzone
konvertiert und beim Abrufen wieder in die aktuelle Zeitzone
zurückkonvertiert. Solange die Zeitzoneneinstellung gleich
bleibt, erhalten Sie denselben Wert zurück, den Sie auch
gespeichert haben. Wenn Sie einen
TIMESTAMP
-Wert speichern, dann die Zeitzone
ändern und den Wert abrufen, unterscheidet sich dieser
abgerufene vom gespeicherten Wert. Grund hierfür ist die
Tatsache, dass unterschiedliche Zeitzonen für die beiden
Konvertierungsvorgänge benutzt wurden. Die aktuelle Zeitzone
ist über den Wert der Systemvariablen
time_zone
verfügbar.
Sie können das Attribut NULL
in die
Definition einer TIMESTAMP
-Spalte
einfügen, damit die Spalte auch NULL
-Werte
enthalten kann. Zum Beispiel:
CREATE TABLE t ( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
Wenn das Attribut NULL
nicht angegeben
wurde und die Spalte auf NULL
gesetzt wird,
wird sie automatisch auf den aktuellen Zeitstempel umgestellt.
Beachten Sie, dass eine TIMESTAMP
-Spalte,
die NULL
-Werte gestattet, den aktuellen
Zeitstempel nur unter einer der folgenden
Bedingungen annimmt:
Ihr Vorgabewert ist als
CURRENT_TIMESTAMP
definiert.
NOW()
oder
CURRENT_TIMESTAMP
werden in die Spalte
eingefügt.
Mit anderen Worten: Eine TIMESTAMP
-Spalte,
die als NULL
definiert ist, wird nur dann
automatisch aktualisiert, wenn sie unter Verwendung einer
Definition wie der folgenden erstellt wurde:
CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
Betrachten Sie im Unterschied dazu folgende Definition einer
TIMESTAMP
-Spalte, die
NULL
-Werte erlaubt, DEFAULT
TIMESTAMP
aber nicht verwendet:
CREATE TABLE t1 (ts TIMESTAMP NULL DEFAULT NULL); CREATE TABLE t2 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00');
In diesem Fall müssen Sie explizit einen Wert einfügen, der den aktuellen Werten für Datum und Uhrzeit entspricht. Zum Beispiel:
INSERT INTO t1 VALUES (NOW()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.