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

时间:2011-04-28 12:14:04

标签: mysql sql datetime mysql-error-1067

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

  1. 将registerDate默认值设置为MySQL NOW()
  2. 将lastVisitDate默认值设置为0000-00-00 00:00:00而不是默认使用的null。
  3. 因为该表已经存在并且有现有记录,所以我想使用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 个答案:

答案 0 :(得分:227)

从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 :(得分:70)

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

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

它也适用于更新

Johan&莱昂纳多涉及转换为时间戳字段。虽然这可能对问题中提供的用例(存储RegisterDate和LastVisitDate)没有问题,但它不是一个通用的解决方案。请参阅datetime vs timestamp问题。

答案 2 :(得分:42)

我的解决方案

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

答案 3 :(得分:13)

EUREKA !!!


对于那些在MySQL中设置默认DATETIME值的人,我确切地知道你的感受/感受。所以这就是:

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

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


重要更新

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

答案 4 :(得分:4)

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

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

答案 5 :(得分:3)

在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();

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

最好的方法是使用" DEFAULT 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();

答案 8 :(得分:0)

这对我有用,使用MySQL:

cv::Ptr

答案 9 :(得分:0)

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

最后,这对我有用!

答案 10 :(得分: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;

答案 11 :(得分:-1)

不确定这是否仍然有效,但此处仍然存在。

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

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

我的mySQL版本是5.5