我在表用户中有两列,即registerDate和lastVisitDate,它们由datetime数据类型组成。我想做以下事情。

将registerDate的默认值设置为MySQL NOW() 将lastVisitDate的默认值设置为0000-00-00 00:00:00,而不是默认使用的null。

因为该表已经存在,并且有已有的记录,所以我想使用修改表。我尝试使用下面的两段代码,但都不起作用。

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

它给我错误:错误1067(42000):无效的默认值为'registerDate'

我是否可以在MySQL中设置默认的日期时间值为NOW() ?


当前回答

我使用触发器作为解决方法,为新插入设置datetime字段为NOW():

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

它也应该适用于更新

Johan和Leonardo的回答涉及到转换到时间戳字段。尽管这对于问题中提出的用例(存储RegisterDate和LastVisitDate)可能是可行的,但这不是一个通用的解决方案。参见日期时间vs时间戳问题。

其他回答

这对我来说很有效——只是把我的表的INSERT更改为UPDATE。

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
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;

从MySQL 5.6.5开始,你可以使用动态缺省值的DATETIME类型:

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

或者甚至将这两个规则结合起来:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

参考: 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

在5.6.5之前,您需要使用TIMESTAMP数据类型,该数据类型在记录被修改时自动更新。然而,不幸的是,每个表只能存在一个自动更新的TIMESTAMP字段。

CREATE TABLE mytable (
  mydate TIMESTAMP
)

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

如果你想阻止MySQL在UPDATE上更新时间戳值(这样它只在INSERT上触发),你可以将定义更改为:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

最后,这对我有用!

不确定这是否仍然活跃,但这里开始。

关于将默认值设置为Now(),我认为DATETIME数据类型不可能这样做。如果你想使用该数据类型,在执行插入时设置日期,如下所示:

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

我的mySQL版本是5.5