mysql - invalid - Establezca NOW() como valor predeterminado para datetime datatype?
mysql time default value (12)
Tengo dos columnas en los usuarios de la tabla, es decir, registerDate and lastVisitDate
que consisten en el tipo de datos datetime. Me gustaría hacer lo siguiente.
- Establecer el valor predeterminado de registerDate en MySQL NOW ()
- Establezca el valor predeterminado de lastVisitDate en
0000-00-00 00:00:00
lugar de null, que usa de manera predeterminada.
Como la tabla ya existe y tiene registros existentes, me gustaría usar la tabla Modificar. 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 NOW () en MySQL?
EUREKA !!!
Para todos aquellos que se desanimaron al tratar de establecer un valor DATETIME predeterminado en MySQL , sé exactamente cómo se sienten / sienten. Asi que aqui esta:
`ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
Observe cuidadosamente que no he agregado comillas simples / comillas dobles alrededor del 0 .
Actualización importante :
Esta respuesta fue publicada hace mucho tiempo. En aquel entonces, funcionó en mi (probablemente última) instalación de MySQL y tuve ganas de compartirla. Lea los comentarios a continuación antes de decidir utilizar esta solución ahora.
A partir de MySQL 5.6.5, puede usar el tipo DATETIME
con un valor predeterminado dinámico:
CREATE TABLE foo (
creation_time DATETIME DEFAULT CURRENT_TIMESTAMP,
modification_time DATETIME ON UPDATE CURRENT_TIMESTAMP
)
O incluso combina 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, debe usar el tipo de datos TIMESTAMP
, que se actualiza automáticamente cada vez que se modifica el registro. Desafortunadamente, sin embargo, solo puede existir un campo TIMESTAMP
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 en UPDATE
(para que solo se active en INSERT
), puede cambiar la definición a:
CREATE TABLE mytable (
mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
En las versiones mysql 5.6.5 y posteriores, puede utilizar fechas precisas y establecer valores predeterminados también. Sin embargo, hay un poco de sutil, que es pasar el valor de precisión tanto a la hora de la fecha como a la llamada a la función NOW ().
Este ejemplo funciona:
ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);
Este ejemplo no funciona:
ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();
Esto funcionó para mí, solo cambié INSERTAR para ACTUALIZAR para mi tabla.
INSERT INTO Yourtable (Field1, YourDateField) VALUES(''val1'', (select now()))
Esto funcionó para mí, usando MySQL:
ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
La mejor manera es hacer un disparador:
/************ ROLE ************/
drop table if exists `role`;
create table `role` (
`id_role` bigint(20) unsigned not null auto_increment,
`date_created` datetime,
`date_deleted` datetime,
`name` varchar(35) not null,
`description` text,
primary key (`id_role`)
) comment='''';
drop trigger if exists `role_date_created`;
create trigger `role_date_created` before insert
on `role`
for each row
set new.`date_created` = now();
Mi solución
ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
No estoy seguro si esto todavía está activo, pero aquí va.
En cuanto a establecer los valores predeterminados a Ahora (), no veo que sea posible para el tipo de datos DATETIME. Si desea usar ese tipo de datos, establezca la fecha en que debe realizar la inserción de esta manera:
INSERT INTO Yourtable (Field1, YourDateField) VALUES(''val1'', (select now()))
Mi versión de mySQL es 5.5
Utilizo un desencadenador como una solución alternativa para establecer un campo de fecha y hora en AHORA () para inserciones nuevas:
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 sea correcto para el caso de uso presentado en la pregunta (almacenamiento de RegisterDate y LastVisitDate), no es una solución universal. Consulte la pregunta de fecha y hora de fecha y hora .
mysql 5.6 dice que CURRENT_TIMESTAMP se puede usar como predeterminado para los tipos de datos TIMESTAMP y DATETIME:
http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html
ALTER TABLE table_name
CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
Finalmente, ¡esto funcionó para mí!
`ALTER TABLE `table_name` CHANGE `column_name`
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
Se puede usar para actualizar la marca de tiempo en la actualización.