¿Establecer AHORA() como valor predeterminado para el tipo de datos de fecha y hora?

Resuelto Ibrahim Azhar Armar asked hace 13 años • 13 respuestas

Tengo dos columnas en la tabla de usuarios, registerDate and lastVisitDateque consisten en el tipo de datos de fecha y hora. Me gustaría hacer lo siguiente.

  1. Establezca el valor predeterminado de RegisterDate en MySQL AHORA()
  2. Establezca el valor predeterminado de lastVisitDate en 0000-00-00 00:00:00lugar de nulo, que utiliza de forma predeterminada.

Debido a que la tabla ya existe y tiene registros existentes, me gustaría usar Modificar tabla. Intenté usar los dos códigos siguientes, pero ninguno funciona.

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

Me da error:ERROR 1067 (42000): Invalid default value for 'registerDate'

¿Es posible para mí establecer el valor de fecha y hora predeterminado en AHORA() en MySQL?

Ibrahim Azhar Armar avatar Apr 28 '11 19:04 Ibrahim Azhar Armar
Aceptado

A partir de MySQL 5.6.5, puedes usar el DATETIMEtipo con un valor predeterminado dinámico:

CREATE TABLE foo (
    creation_time      DATETIME DEFAULT   CURRENT_TIMESTAMP,
    modification_time  DATETIME ON UPDATE CURRENT_TIMESTAMP
)

O incluso combinar ambas reglas:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Referencia:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available .html

Antes de 5.6.5, era necesario utilizar el TIMESTAMPtipo de datos, que se actualiza automáticamente cada vez que se modifica el registro. TIMESTAMPLamentablemente, sin embargo, solo puede existir un campo actualizado automáticamente por tabla.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

Ver: http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Si desea evitar que MySQL actualice el valor de la marca de tiempo UPDATE(para que solo se active el INSERT), puede cambiar la definición a:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
Johan avatar Apr 28 '2011 12:04 Johan

Utilizo un disparador como solución para establecer un campo de fecha y hora en AHORA() para nuevas inserciones:

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

debería funcionar para actualizaciones también

Las respuestas de Johan y Leonardo implican la conversión a un campo de marca de tiempo. Aunque esto probablemente esté bien para el caso de uso presentado en la pregunta (almacenar RegisterDate y LastVisitDate), no es una solución universal. Consulte la pregunta sobre fecha y hora frente a marca de tiempo .

wardk avatar Nov 16 '2013 11:11 wardk

Mi solución

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
Leonardo avatar Oct 25 '2012 00:10 Leonardo