2011-02-04 10 views
56

Quiero definir la tabla que tendrá 2 campos de fecha y hora, calle detrás de esta manera:MySQL CURRENT_TIMESTAMP en crear y en la actualización

CREATE TABLE `msgs` (
    `id` INT PRIMARY KEY AUTO_INCREMENT, 
    `msg` VARCHAR(256), 
    `ts_create` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `ts_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) 

Cómo hacer este error evitando:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause 

punto es mantenga el comportamiento deseado de ts_create y ts_update en el esquema de la tabla.

+0

Creo que el error es claro y lo que buscas es la forma alternativa de usar haz lo mismo que current_timestamp – GusDeCooL

Respuesta

45

Esto es una limitación de mySQL, no puede tener dos columnas TIMESTAMP con valores predeterminados que hacen referencia a CURRENT_TIMESTAMP. La única forma de hacerlo sería usar un tipo DATETIME para ts_create que desafortunadamente no puede tener un valor predeterminado de NOW(). Sin embargo, puedes hacer rodar tu propio disparador para que eso suceda.

+34

MySQL ahora es compatible con múltiples columnas TIMESTAMP que hacen referencia a CURRENT_TIMESTAMP (desde la versión 5.6.5 lanzada en 2012). http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html – Vaughan

0

Creo que tal vez desee ts_create como datetime (así que cambie el nombre -> dt_create) y solo ts_update como timestamp? Esto asegurará que permanezca invariable una vez configurado.

Según entiendo, datetime es para valores controlados manualmente, y timestamp es un poco "especial" ya que MySQL lo mantendrá por usted. En este caso, datetime es una buena opción para ts_create.

0

Yo diría que no necesita tener el DEFAULT CURRENT_TIMESTAMP en su ts_update: si está vacío, entonces no se actualiza, por lo que su 'última actualización' es el ts_create.

+0

no puedes tener ON ACTUALIZAR TIMESTAMP si tienes otro campo con TIMESTAMP en DEFAULT – Jeger

+0

Lo sé. Pero la pregunta no era "¿por qué sucede esto?", Sino "¿cómo puedo evitarlo?". Esto responde a esa pregunta, creo que es mejor que "cambiar los tipos de datos y hacer un desencadenante". – Nanne

1

Creo que es posible mediante el uso de la técnica de abajo

`ts_create` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
`ts_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
+0

'0000-00-00 00:00:00' no es una marca de tiempo válida, aunque mysql permitir, muchas otras bases de datos no permiten '0000-00-00 00:00:00' como predeterminado al tipo de datos timestamp, por lo que en cierto momento, si está migrando lejos de mysql, esto sería doloroso. – imVJ

+0

Esto es realmente doloroso también en MySQL, no debería usar ceros para inicializar una marca de tiempo o una columna de fecha/hora. –

3

Está utilizando una versión más antigua de MySQL. Actualice su myqsl a 5.6.5+, funcionará.

+0

No funcionó para mí. – AnixPasBesoin

6

Supongo que esta es una publicación anterior, pero en realidad supongo que mysql es compatible con 2 TIMESTAMP en sus últimas ediciones mysql 5.6.25, eso es lo que estoy usando a partir de ahora.

0

Ésta es la pequeña limitación de MySQL en la versión anterior, en realidad después de la versión 5.6 y más tarde varias marcas de tiempo que funciona ...

0

puede probar esta ts_create DEFAULT TIMESTAMP CURRENT_TIMESTAMP, ts_update TIMESTAMP NULL DEFAULT EN ACTUALIZACIÓN CURRENT_TIMESTAMP

Cuestiones relacionadas