将NOW()设置为datetime数据类型的默认值?

我在表用户中有两列,分别是由datetime数据类型组成的registerDate and lastVisitDate 。 我想要做以下事情。

  • 将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;
    

    它给我错误: ERROR 1067 (42000): Invalid default value for 'registerDate'

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


    从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
    )
    

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

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

    它也应该适用于更新

    Johan&Leonardo的答案涉及转换为时间戳字段。 虽然这对于问题中提出的用例(存储RegisterDate和LastVisitDate)可能没有问题,但这不是一个通用的解决方案。 查看datetime vs timestamp问题。


    我的解决方案

    ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
    NULL DEFAULT CURRENT_TIMESTAMP;
    
    链接地址: http://www.djcxy.com/p/25115.html

    上一篇: Set NOW() as Default Value for datetime datatype?

    下一篇: Rails 4: List of available datatypes