Nota: En antiguas versiones
de MySQL (antes de la 4.1), las propiedades de las columnas
TIMESTAMP
difieren significativamente en
muchas cosas de lo que se describe en esta sección. Si
necesita convertir datos TIMESTAMP
antiguos
para que funcionen con MySQL 5.0, asegúrese de consultar
Manual de referencia de MySQL 4.1 para más detalles.
En MySQL 5.0, TIMESTAMP
se muestran en el
mismo formato que las columnas DATETIME
. En
otras palabras, el ancho de muestra se limita a 19 caracteres,
y el formato es YYYY-MM-DD HH:MM:SS
.
El servidor MySQL puede ejecutarse en modo
MAXDB
. Cuando el servidor corre en este
modo, TIMESTAMP
es idéntico a
DATETIME
. Esto es, si el servidor está
ejecutándose en modo MAXDB
cuando se crea
una tabla, las columnas TIMESTAMP
se crean
como columnas DATETIME
. Como resultado,
tales columnas usan el formato de salida de
DATETIME
, tienen el mismo rango de valores,
y no hay inicialización automática o actualización de la
fecha y hora actual.
Para activar el modo MAXDB
, cambie el modo
SQL del servido aMAXDB
cuando arranque
usando la opción --sql-mode=MAXDB
o
cambiando en tiempo de ejecución la variable global
sql_mode
:
mysql> SET GLOBAL sql_mode=MAXDB;
Un cliente puede hacer que el servidor se ejecute en modo
MAXDB
para sus propias conexiones como se
muestra:
mysql> SET SESSION sql_mode=MAXDB;
Desde MySQL 5.0.2, MySQL no acepta valores timestamp que
incluyan cero en la columna de día o hora o valores que no
sean fechas válidas. La única excepción es el valor
especial '0000-00-00 00:00:00'
.
En MYSQL 5.0, tiene considerable flexibilidad para determinar
cuando se actualiza e inicializa automáticamente
TIMESTAMP
y qué columna debe tener ese
comportamiento:
Puede asignar la fecha y hora actual como el valor por defecto y el valor de actualización automático, como se hacía anteriormente. Pero es posible tener sólo uno u otro comportamiento automático, o ninguno de ellos. (No es posible tener un comportamiento para una columna y el otro para la otra columna.)
Puede especificar qué columna
TIMESTAMP
inicializar o actualizar con
la fecha y hora actuales. Ya no hace falta que sea la
primera columna TIMESTAMP
.
Tenga en cuenta que la información en la siguiente discusión
se aplica a columnas TIMESTAMP
sólo para
tablas no creadas con el modo MAXDB
activado. (Como se menciona anteriormente, el modo
MAXDB
hace que las columnas se creen como
columnas DATETIME
.) Las reglas que
gobiernan la inicialización y actualización de columnas
TIMESTAMP
en MySQL 5.0 son las siguientes:
Si un valor DEFAULT
se especifica para
la primera columna TIMESTAMP
en una
tabla, no se ignora. El valor por defecto puede ser
CURRENT_TIMESTAMP
o una fecha y hora
constante.
DEFAULT NULL
es lo mismo que
DEFAULT CURRENT_TIMESTAMP
para la
primera columna
TIMESTAMP
. Para cualquier otra columna
TIMESTAMP
, DEFAULT
NULL
se trata como DEFAULT 0
.
Cualquier columna TIMESTAMP
individual
en una tabla puede actualizarse e inicializarse con la
fecha y hora actual automáticamente.
En un comando CREATE TABLE
, la primera
columna TIMESTAMP
puede declararse de
cualquiera de las siguientes formas:
Con las cláusulas DEFAULT
CURRENT_TIMESTAMP
y ON UPDATE
CURRENT_TIMESTAMP
, la columna tiene la fecha
y hora actual como su valor por defecto, y se
actualiza automáticamente.
Sin las cláusulas DEFAULT
ni
ON UPDATE
, es lo mismo que
DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP
.
Con la cláusula DEFAULT
CURRENT_TIMESTAMP
y sin ON
UPDATE
, la columna tiene la fecha y hora
actual como valor por defecto pero no se actualiza
automáticamente.
Sin cláusula DEFAULT
y con
cláusula ON UPDATE
CURRENT_TIMESTAMP
, la columna tiene por
defecto 0 y se actualiza automáticamente.
Con un valor constante DEFAULT
, la
columna tiene el valor dado por defecto. Si la columna
tiene una cláusula ON UPDATE
CURRENT_TIMESTAMP
se actualiza
automáticamente, de otro modo no lo hace.
En otras palabras, puede usar la fecha y hora actuales
para el valor inicial y el valor de actualización
automática, o uno de ellos o ninguno. (Por ejemplo, puede
especificar ON UPDATE
para activar
actualización automática sin tener la columna
inicializada .)
Cualquiera de CURRENT_TIMESTAMP
,
CURRENT_TIMESTAMP()
, o
NOW()
puede usarse en las cláusulas
DEFAULT
y ON UPDATE
. Todas tienen el mismo efecto.
El orden de los dos atributos no importa. Si se
especifican DEFAULT
y ON
UPDATE
para una columna
TIMESTAMP
, cualquiera puede preceder al
otro.
Ejemplo. Estos comandos son equivalentes:
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);
Para especificar el valor por defecto o actualización
automática para una columna TIMESTAMP
distinta a la primera, debe suprimir la actualización e
inicialización automática de la primera columna
TIMESTAMP
asignándole explícitamente
una valor constante DEFAULT
(por
ejemplo, DEFAULT 0
o DEFAULT
'2003-01-01 00:00:00'
). Luego, para la otra
columna TIMESTAMP
, las reglas son las
mismas que para la misma columna
TIMESTAMP
, excepto que no puede omitir
ambas cláusulas DEFAULT
y ON
UPDATE
. Si lo hace, no habrá inicialización
ni actualización automática.
Ejemplo, estos comandos son equivalentes:
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);
En MySQL 5.0, puede asignar la zona horaria actual para cada
conexión, como se describe en
Sección 5.9.8, “Soporte de zonas horarias en el servidor MySQL”. Los valores
TIMESTAMP
se almacenan en UTC,
convirtiéndose desde la zona horaria actual para
almacenamiento, y volviéndose a convertir a la zona horaria
actual al mostrarse. Mientras la zona horaria permanezca
constante, puede obtener el mismo valor que hay almacenado. Si
almacena un valor TIMESTAMP
, cambia la zona
horaria y luego rescata el valor, es diferente que el valor
almacenado. Esto ocurre porque no se usa la misma zona horaria
para la conversión en ambas direcciones. La zona horaria
actual está disponible en la variable de sistema
time_zone
.
Puede incluir el atributo NULL
en la
definición de una columna TIMESTAMP
para
permitir que la columna contenga valores
NULL
. Por ejemplo:
CREATE TABLE t ( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP );
Si el atributo NULL
no se especifica,
asignar el valor NULL
a la columna resulta
en que se almacena la hora y fecha actuales. Tenga en cuenta
que una columna TIMESTAMP
que permita
valores NULL
no no almacenará la fecha y
hora actual a no ser que su valor por defecto se defina como
CURRENT_TIMESTAMP
,
o NOW()
o
CURRENT_TIMESTAMP
se inserte en la columna.
En otras palabras, una columna TIMESTAMP
definida como NULL
se actualizará
automáticamente sólo si se crea usando una definición como
las siguientes:
CREATE TABLE t (ts NULL DEFAULT CURRENT_TIMESTAMP);
De otro modo - esto es, si la columna
TIMESTAMP
se define usando
NULL
pero no usando DEFAULT
TIMESTAMP
, como se muestra aquí...
CREATE TABLE t1 (ts NULL DEFAULT NULL); CREATE TABLE t2 (ts NULL DEFAULT '0000-00-00 00:00:00');
...entonces debe insertar el valor explícitamente correspondiente a la fecha y hora actuales. Por ejemplo:
INSERT INTO t1 VALUES (NOW()); INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.