¿Establecer NOW () como valor predeterminado para el tipo de datos datetime?

197

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

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

Debido a que la tabla ya existe y tiene registros existentes, me gustaría usar la tabla Modificar. Intenté usar los dos códigos a continuación, 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 predeterminado de fecha y hora en NOW () en MySQL?

Ibrahim Azhar Armar
fuente
44
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. No definiste el data typecampo en ambos esfuerzos
Shakti Singh
3
Dado que MySQL 5.6 DATEdebería funcionar con el valor predeterminadoNOW()
AbcAeffchen
De acuerdo con esta documentación de mysql 5.6: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html , puede usar CURRENT_TIMESTAMP () de forma predeterminada.
blacktie24
¿Cómo implementaría CURRENT_TIMESTAMP + 1 DAY?
Ilker Baltaci

Respuestas:

241

A partir de MySQL 5.6.5, puede 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, debe usar el TIMESTAMPtipo de datos, que se actualiza automáticamente cada vez que se modifica el registro. Lamentablemente, sin embargo, solo TIMESTAMPpuede existir un campo de actualización automática 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 INSERT), puede cambiar la definición a:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
Johan
fuente
80
Realmente no quiero usar la marca de tiempo.
Ibrahim Azhar Armar
2
@Ibrahim: la marca de tiempo es tu única oportunidad. Si usa un campo de fecha y hora, debe insertar el registro usando now () cada vez.
Nicola Cossu
9
El manual dice claramente: "Esto significa, por ejemplo, que no puede establecer el valor predeterminado para una columna de fecha como el valor de una función como NOW () o CURRENT_DATE".
Nicola Cossu
19
@Johan a DATETIMEmenudo prefiere hacer el rango que puede contener: '1000-01-01 00:00:00' a '9999-12-31 23:59:59' en comparación con TIMESTAMPS's' 1970-01-01 00: 00:01 'UTC a' 2038-01-19 03:14:07 'UTC. Para fines de almacenamiento de fechas de nacimiento, o algo más de 30 años en el futuro, por ejemplo.
usuario17753
55
@nickrulez Ya no está restringido a timestampeste comportamiento a partir de MySQL 5.6
Dan Esparza
70

Utilizo un desencadenador como solución alternativa para establecer un campo de fecha y hora en NOW () 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. Vea la pregunta de fecha y hora con marca de tiempo .

Wardk
fuente
44
Esta debería ser la respuesta aceptada, pero específicamente debe editarla para que sea obvio que es para un campo de fecha y hora. El póster original quiere saber cómo resolverlo para un campo de fecha y hora, y use a timestampes una solución tonta si realmente aprende la diferencia entre estos dos tipos de datos.
phpguru
45

Mi solución

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
Leonardo
fuente
Esta definición funciona, les recomiendo a todos usar SQLYog o una herramienta como esa, les permite hacer esto en una interfaz fácil.
Ladrillo inmutable
27
Esta sigue siendo la solución para la TIMESTAMPcolumna. Nadie estaba pidiendo TIMESTAMP...
Petr Peller
2
Sí, esta no es la respuesta a la pregunta. TIMESTAMP es un tipo diferente de campo para DATETIME.
John Hunt
@Leonardo, ¿cómo puedo mostrar solo la fecha
151291
13

EUREKA !!!


Para todos aquellos que perdieron el corazón tratando de establecer un valor DATETIME predeterminado en MySQL , sé exactamente cómo te sientes. 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 la última) instalación de MySQL y tuve ganas de compartirlo. Lea los comentarios a continuación antes de decidir utilizar esta solución ahora.

Augiwan
fuente
16
Depende de las expectativas ... - Esta solución le permite tener el campo NO NULO, ya que se proporciona un valor predeterminado. - Esta solución no establecerá el campo en AHORA ().
CodeReaper
10
Esto no responde a la pregunta original; la respuesta debería indicarlo claramente.
Matt Browne
2
Tenga en cuenta que el modo SQL TRADICIONAL incluye NO_ZERO_DATE, por lo que lo anterior no funcionará en ese caso.
Más
Según las respuestas proporcionadas, suena como si no sacrificaras DATETIME para ser TIMESTAMP, entonces debes usar disparadores.
Chris
1
Esta solución tendrá algunos apis locos con "¡OMG es una fecha CERO! ¡Qué HERESIA! ¡No podemos convertir 'esto' en java.lang.Date/System.DateTime! OMG! -Crashes-".
Felype
4

En las versiones mysql 5.6.5 y posteriores, puede usar fechas y fechas precisas y establecer valores predeterminados también. Sin embargo, hay un bit sutil, que es pasar el valor de precisión a la llamada a la función datetime y 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();
Matteius
fuente
1
`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.

veelen
fuente
1

La mejor manera es usar "DEFAULT 0". Otra manera:

    /************ 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();
Lucas Moyano Angelini
fuente
0

Esto funcionó para mí, usando MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
rosshump
fuente
0
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Finalmente, ¡esto funcionó para mí!

Ojo de águila
fuente
0
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
  `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Gvs Akhil
fuente
-1

No estoy seguro si esto todavía está activo, pero aquí va.

Con respecto a establecer los valores predeterminados en Now (), no veo que eso sea posible para el tipo de datos DATETIME. Si desea utilizar ese tipo de datos, configure la fecha cuando realice la inserción de esta manera:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

Mi versión de mySQL es 5.5

Jorge
fuente
77
Se puede simplificar como:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753
-1

Esto funcionó para mí, solo cambié INSERTAR a ACTUALIZAR para mi mesa.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Generación Diiferente
fuente