首页 文章

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

提问于
浏览
174

表用户中有两列,即 registerDate and lastVisitDate ,由日期时间数据类型组成 . 我想做以下几点 .

  • 将registerDate默认值设置为MySQL NOW()

  • 将lastVisitDate默认值设置为 0000-00-00 00:00:00 而不是默认使用的null .

因为表已经存在并且有现有记录,所以我想使用Modify表 . 我尝试过使用下面的两段代码,但都不行 .

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()吗?

12 回答

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

    最后,这对我有用!

  • 69

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

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

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

    它也适用于更新

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

  • 219

    我的解决方案

    ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
    NULL DEFAULT CURRENT_TIMESTAMP;
    
  • 0

    EUREKA !!!


    对于所有那些为了设置_1148674而失去信心的人,我确切地知道你的感受/感受 . 所以这里是:

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

    仔细观察 0 周围的 I haven't added single quotes/double quotes .


    Important update

    这个答案很久以前发布了 . 那时候,它适用于我的(可能是最新的)MySQL安装,我感觉就像分享它一样 . 在您决定立即使用此解决方案之前,请阅读以下注释 .

  • 43

    mysql 5.6 docs说CURRENT_TIMESTAMP可以用作TIMESTAMP和DATETIME数据类型的默认值:

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

  • 0

    最好的方法是触发:

    /************ 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

    在mysql 5.6.5及更高版本上,您可以使用精确的日期时间并设置默认值 . 但是有一个微妙的位,即将精度值传递给datetime和NOW()函数调用 .

    此示例有效:

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

    此示例不起作用:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();
    
  • 0
    `ALTER TABLE  `table_name` CHANGE `column_name` 
        timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
        ON UPDATE CURRENT_TIMESTAMP
    

    可用于更新更新时的时间戳 .

  • 4

    这对我有用,使用MySQL:

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

    不确定这是否仍然有效,但这里有 .

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

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

    我的mySQL版本是5.5

  • -1

    这对我有用 - 只是为我的表更改了INSERT到UPDATE .

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

相关问题