211

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

  1. 将 registerDate 默认值设置为 MySQL NOW()
  2. 将 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() 吗?

4

13 回答 13

265

从 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 更新时间戳值 on UPDATE(以便它仅触发 on INSERT),您可以将定义更改为:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
于 2011-04-28T12:16:51.607 回答
71

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

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

它也应该适用于更新

Johan & Leonardo 的回答涉及转换为时间戳字段。虽然这对于问题中提出的用例(存储 RegisterDate 和 LastVisitDate)可能没问题,但它不是一个通用的解决方案。请参阅日期时间与时间戳问题。

于 2013-11-16T11:15:45.700 回答
47

我的解决方案

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;
于 2012-10-25T00:11:54.217 回答
14

尤里卡!!!


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

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

仔细观察我没有在0周围添加单引号/双引号。


重要更新

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

于 2011-06-22T17:35:24.167 回答
9

在 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();
于 2017-04-06T22:36:12.990 回答
4

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

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

于 2015-09-09T12:52:01.003 回答
1
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

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

于 2013-05-07T14:06:47.120 回答
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();
于 2015-02-19T13:33:46.763 回答
0

这对我有用,使用 MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();
于 2017-08-02T09:06:17.237 回答
0
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

最后,这对我有用!

于 2018-04-26T21:39:45.657 回答
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;
于 2020-02-16T10:22:14.740 回答
-1

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

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

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

我的 mySQL 版本是 5.5

于 2011-11-25T23:54:22.103 回答
-1

这对我有用 - 只是将我的表的 INSERT 更改为 UPDATE 。

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
于 2017-11-28T19:31:16.007 回答