是否将NOW()设置为日期时间数据类型的默认值?


197

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

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


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP。您data type在两次尝试中都没有定义领域的领域
Shakti Singh

3
由于MySQL 5.6 DATE应该使用默认值NOW()
AbcAeffchen 2014年

根据此mysql 5.6文档:dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html,可以将CURRENT_TIMESTAMP()用作默认值。
blacktie24

我将如何实施CURRENT_TIMESTAMP + 1天
Ilker Baltaci,2017年

Answers:


241

从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将timestamp值更新为on UPDATE(以便仅在on触发INSERT),则可以将定义更改为:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

80
我真的不想使用时间戳。
Ibrahim Azhar Armar

2
@易卜拉欣:时间戳是您唯一的机会。如果使用日期时间字段,则必须每次使用now()插入记录。
Nicola Cossu 2011年

9
手册说得很清楚:“例如,这意味着您不能将日期列的默认值设置为诸如NOW()或CURRENT_DATE之类的函数的值”。
Nicola Cossu 2011年

19
DATETIMETIMESTAMPS'1970-01-01 00 '相比,@Johan 通常更喜欢做它可以保持的范围:'1000-01-01 00:00:00'到'9999-12-31 23:59:59' 00:01'UTC到'2038-01-19 03:14:07'UTC。为了存储出生日期或未来30年以上的日期。
user17753

5
@nickrulez timestamp从MySQL 5.6 开始,您不再受此行为的限制
Dan Esparza 2015年

70

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

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

它也应该适用于更新

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


4
这应该是可接受的答案,但是特别是您应该对其进行编辑,以使其明显适用于日期时间字段。最初的发布者想知道如何解决datetime字段,use a timestamp如果您真的了解这两种数据类型之间的区别,那是一个愚蠢的解决方法。
phpguru

45

我的解决方案

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

此定义有效,我建议每个人都使用SQLYog或类似的工具,它使您可以在简单的界面上执行此操作。
不可变的砖块

27
这仍然是TIMESTAMP专栏的解决方案。没有人要求TIMESTAMP...
切赫佩勒

2
是的,这不是问题的答案。TIMESTAMP是与DATETIME不同的字段类型。
约翰·亨特

@Leonardo我如何只显示日期
151291 2015年

13

EUREKA!


对于所有想在MySQL中设置默认DATETIME值而灰心的人,我确切地知道您的感觉/感觉。所以这里是:

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

仔细观察一下,我还没有0周围添加单引号/双引号


重要更新

这个答案早就发布了。当时,它可以在我(可能是最新的)MySQL安装上运行,并且我想共享它。在决定立即使用此解决方案之前,请阅读下面的评论。


16
这取决于期望...-此解决方案使您可以将字段NOT NULL设置为空,因为提供了默认值。-此解决方案不会将字段设置为NOW()。
CodeReaper 2012年

10
这没有回答原始问题;答案应清楚说明。
马特·布朗

2
请注意,TRADITIONAL SQL模式包括NO_ZERO_DATE,因此以上情况在这种情况下不起作用。
莫兹

根据提供的答案,听起来好像如果您不牺牲DATETIME作为TIMESTAMP,则必须使用触发器。
克里斯,

1
此解决方案将带有一些api,它们带有“ OMG零日期!这真是令人讨厌的东西!我们无法将'this'转换为java.lang.Date/System.DateTime!OMG!-crashes-”。
Felype


4

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

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

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


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

0

使用MySQL,这对我有用:

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

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

最后,这对我有用!


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;

-1

不知道这是否仍处于活动状态,但是可以进行下去。

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

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

我的MySQL版本是5.5


7
可以简化为:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753

-1

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

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.