Hace un tiempo descubrí una característica (tal vez sea un bug) sobre los campos timestamp de MySQL. Es probable que este documentado en alguna parte que todavía no he leído:
Cuando se añade un campo timestamp a una tabla, MySQL agrega mágicamente algunas características al nuevo campo creado como un «trigger» y la fecha actual como valor por defecto.
Aquí esta el script donde se produce el caso:
-- CREANDO UNA TABLA CUALQUIERA E INSERTANDO DATOS
mysql> create table t(
-> id int not null primary key auto_increment,
-> val varchar(50)
-> );
Query OK, 0 rows affected (0.15 sec)
mysql> insert into t (val) values ("foo") ,("var");
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t;
+----+------+
| id | val |
+----+------+
| 1 | foo |
| 2 | var |
+----+------+
2 rows in set (0.00 sec)
-- AGREGANDO UN CAMPO TIMESTAMP Y MAS DATOS
mysql> alter table t add ts_field timestamp;
Query OK, 2 rows affected (0.35 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into t (val) values ("foo 2") ,("var 2");
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
-- HE AQUI LA MAGIA:
mysql> select * from t;
+----+-------+---------------------+
| id | val | ts_field |
+----+-------+---------------------+
| 1 | foo | 0000-00-00 00:00:00 |
| 2 | var | 0000-00-00 00:00:00 |
| 3 | foo 2 | 2013-01-09 23:20:01 | <---
| 4 | var 2 | 2013-01-09 23:20:01 | <---
+----+-------+---------------------+
4 rows in set (0.00 sec)
¿¡Pero que acaba de pasar!?
no lo sé.
La nueva estructura de la tabla es:
CREATE TABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`val` varchar(50) DEFAULT NULL,
`ts_field` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
Esto sólo pasa cuando en la tabla no existe otro campo timestamp aún.
Ahora, es útil? tal vez. Es un BUG? tal vez.
El "extraño caso" se repite en MySQL 5.1 y 5.5.
Update: Es una característica documentada en https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html , me disculpo por el post que finalmente resultó ser una chorrada, un lapsus, un horror.
Al agregar un nuevo registro, el campo ts_field siempre guardará la fecha actual, por ser del tipo timestamp, no es un bug, te falta leer mas sobre este campo en mysql
Tienes razón ¿anonimus?, no leí ese fragmento del manual.
https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html
Pero NO SIEMPRE se guardará la fecha actual por ser timestamp, si agregas un campo mas de tipo timestamp no sucede lo mismo.
Un saludo.