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

Set NOW() as Default Value for datetime datatype?

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

  • 将registerdate默认值设置为mysql now()。
  • 将LastVisitDate默认值设置为0000-00-00 00:00:00,而不是默认使用的空值。
  • 因为该表已经存在并且有现有记录,所以我想使用修改表。我试过使用下面的两段代码,但都不起作用。

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

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


    从MySQL5.6.5开始,可以使用带有动态默认值的DATETIME类型:

    1
    2
    3
    4
    CREATE TABLE foo (
        creation_time      DATETIME DEFAULT   CURRENT_TIMESTAMP,
        modification_time  DATETIME ON UPDATE CURRENT_TIMESTAMP
    )

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

    参考文献:http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.htmlhttp://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available.html

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

    1
    2
    3
    CREATE TABLE mytable (
      mydate TIMESTAMP
    )

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

    如果要防止mysql更新UPDATE上的时间戳值(这样它只在INSERT上触发),可以将定义更改为:


    我使用触发器作为解决方法,将新插入的日期时间字段设置为now():

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

    它也应该适用于更新

    Johan&Leonardo的答案涉及到转换到时间戳字段。尽管这对于问题中的用例(存储registerdate和lastvisitdate)可能是可以的,但它不是一个通用的解决方案。请参见日期时间与时间戳问题。


    我的解决方案


    尤里卡!!!!

    对于那些在MySQL中试图设置默认日期时间值而失去信心的人来说,我完全知道你的感受。这里是:

    1
    `ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

    仔细观察,我没有在0附近添加单引号/双引号。

    重要更新:

    这个答案很早就贴出来了。当时,它在我(可能是最新的)MySQL安装中起作用,我想分享它。在决定现在使用此解决方案之前,请阅读下面的注释。


    MySQL5.6文档说当前的时间戳可以作为时间戳和日期时间数据类型的默认值:

    http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html


    在MySQL5.6.5及更高版本上,您可以使用精确的日期时间并设置默认值。不过,还有一点很微妙,那就是将精度值传递给datetime和now()函数调用。

    此示例有效:

    1
        ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

    此示例不起作用:

    1
        ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();


    最好的方法是使用"默认0"。其他方式:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        /************ 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();

    1
    2
    3
    `ALTER TABLE  `table_name` CHANGE `column_name`
        timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
        ON UPDATE CURRENT_TIMESTAMP

    可用于在更新时更新时间戳。


    1
    2
    ALTER TABLE table_name
      CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

    最后,这对我有用!


    这对我很有用,使用mysql:

    1
    ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();


    这对我很有效-刚将insert更改为update for my table。

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


    不确定这是否仍然是活动的,但这里是。

    关于将默认值设置为now(),我认为对于datetime数据类型来说,这是不可能的。如果要使用该数据类型,请按如下方式设置执行插入操作的日期:

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

    我的MySQL版本是5.5