Para insertar automáticamente la fecha y la hora, es decir, el
timestamp, en un campo de tipo TIMESTAMP en una tabla en MySQL podemos utilizar
CURRENT_TIMESTAMP, siempre que estemos utilizando una versión de
servidor Mysql superior a la 4.1.
Si se utiliza el timestamp automático en las inserciones, cuando
se omita el campo en una inserción, éste tomara el valor de fecha
y hora que tenga el servidor en ese momento. Para esto se debe
usar la propiedad DEFAULT CURRENT_TIMESTAMP en la creación del
campo.
Si se utiliza en las actualizaciones, cuando se produzca una
sentencia UPDATE que omita el campo que tiene la propiedad en el
timestamp, el campo tomará el valor actual de fecha y hora del
servidor. Para esto se debe usar la propiedad ON UPDATE
CURRENT_TIMESTAMP en la creación del campo.
Se pueden usar por separado, o combinadas:
Tabla con un campo timestamp que toma un valor de fecha automático tanto en inserciones como actualizaciones
mysql> CREATE TABLE tabla_ejemplo1 (
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.09 sec)
Tabla con un campo timestamp que toma un valor de fecha automático tanto en inserciones pero NO en actualizaciones
mysql> CREATE TABLE tabla_ejemplo2 (
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.03 sec)
Tabla con un campo timestamp que toma un valor de fecha automático en actualizaciones pero NO en inserciones
mysql> CREATE TABLE tabla_ejemplo3 (
fecha TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.02 sec)
Ejemplo de inserción en una tabla con un campo DEFAULT CURRENT_TIMESTAMP
mysql> INSERT INTO tabla_ejemplo2 VALUES();
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM tabla_ejemplo2;
+---------------------+
| fecha |
+---------------------+
| 2008-05-31 20:06:50 |
+---------------------+
1 row in set (0.00 sec)
Ejemplo de actualización de un campo con la propiedad ON UPDATE CURRENT_TIMESTAMP
mysql> INSERT INTO tabla_ejemplo3 VALUES();
Query OK, 1 row affected (0.03 sec)
mysql> ALTER TABLE tabla_ejemplo3 ADD COLUMN descripcion
VARCHAR(20);
Query OK, 1 row affected (0.13 sec)
mysql> UPDATE tabla_ejemplo3 SET descripcion =
'descripcion';
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM tabla_ejemplo3;
+---------------------+-------------+
| fecha | descripcion |
+---------------------+-------------+
| 2008-05-31 20:00:00 | descripcion |
+---------------------+-------------+
1 row in set (0.00 sec)
Este sistema tiene la limitación de que solamente puede
haber un campo DEFAULT CURRENT_TIMESTAMP por cada tabla,
si intentamos crear dos, nos devolverá el siguiente error:
mysql> CREATE TABLE tabla_ejemplo4 (
-> descripcion VARCHAR(30),
-> fecha_uno TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-> fecha_dos TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
ERROR 1293 (HY000): Incorrect table definition; there can be only
one TIMESTAMP
column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE
clause
Las columnas con la propiedad ON UPDATE CURRENT_TIMESTAMP están
sujetas a la misma limitación.
También estamos limitados en el orden en el que creamos las
columnas de tipo TIMESTAMP, la única columna que puede utilizar
la propiedad CURRENT_TIMESTAMP es la primera en el orden de
declaración, a no ser que le indiquemos un valor por defecto a la
primera columna TIMESTAMP, ejemplo:
mysql> CREATE TABLE tabla_ejemplo4 (
-> descripcion VARCHAR(30),
-> fecha_uno TIMESTAMP,
-> fecha_dos TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
ERROR 1293 (HY000): Incorrect table definition; there can be only
one TIMESTAMP
column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE
clause
mysql> CREATE TABLE tabla_ejemplo4 (
-> descripcion VARCHAR(30),
-> fecha_uno TIMESTAMP DEFAULT 0,
-> fecha_dos TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.03 sec)
Se puede utilizar cualquiera de estas opciones en lugar de CURRENT_TIMESTAMP: CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, o LOCALTIMESTAMP().
mysql> CREATE TABLE tabla_ejemplo5 (
-> descripcion VARCHAR(30),
-> fecha_uno TIMESTAMP DEFAULT NOW());
Query OK, 0 rows affected (0.03 sec)
mysql> CREATE TABLE tabla_ejemplo6 (
-> descripcion VARCHAR(30),
-> fecha_uno TIMESTAMP DEFAULT LOCALTIME);
Query OK, 0 rows affected (0.03 sec)
Nota: No se puede utilizar DEFAULT
CURRENT_TIMESTAMP en la declaración de una columna de la tabla y
ON UPDATE CURRENT_TIMESTAMP en otra columna diferente, si lo
hacemos, nos devolverá un error de definición de tabla
incorrecta.
mysql> CREATE TABLE dif_columnas (
-> creado TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-> actualizado TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> datos CHAR(20));
ERROR 1293 (HY000): Incorrect table definition; there can be only
one TIMESTAMP
column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE
clause