¿Establecer AHORA() como valor predeterminado para el tipo de datos de fecha y hora?
Tengo dos columnas en la tabla de usuarios, registerDate and lastVisitDate
que consisten en el tipo de datos de fecha y hora. Me gustaría hacer lo siguiente.
- Establezca el valor predeterminado de RegisterDate en MySQL AHORA()
- Establezca el valor predeterminado de lastVisitDate en
0000-00-00 00:00:00
lugar 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?
A partir de MySQL 5.6.5, puedes usar el DATETIME
tipo 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 TIMESTAMP
tipo de datos, que se actualiza automáticamente cada vez que se modifica el registro. TIMESTAMP
Lamentablemente, 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
)
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 .
Mi solución
ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;