MySQL之datetime类型的列设置默认值为CURRENT_TIMESTAMP

本文介绍在MySQL中如何正确设置datetime(3)类型的列默认值为CURRENT_TIMESTAMP(3),并提供创建表和修改列类型的SQL语句示例。强调了在设置datetime(3)类型默认值时,应使用CURRENT_TIMESTAMP(3)而非CURRENT_TIMESTAMP()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

根据《阿里巴巴Java开发手册(正式版)》,数据表中必备三字段:id,gmt_create,gmt_modified.gmt_create和gmt_modified均为datetime类型.但是datetime类型精确到s,对于有些需要精确到ms的需求应为datetime(3)类型.为了便于开发,会将其默认值设置为当前时间,但如何将datetime(3)类型的列设置为当前时间呢

解决方案

建立数据表时设置默认值

建表语句如下:

1

2

3

4

5

6

7

CREATE TABLE `user`  (

  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,

  `gmt_create` datetime(3) NULL DEFAULT CURRENT_TIMESTAMP(3),

  `gmt_modified` datetime(3) NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),

  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '',

  PRIMARY KEY (`id`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

使用ALTER TABLE 修改默认值

有两种方式修改列类型和默认值,如下:

ALTER TABLE user MODIFY [COLUMN] gmt_create datetime(3) DEFAULT CURRENT_TIMESTAMP(3); ALTER TABLE user CHANGE gmt_create gmt_create datetime(3) DEFAULT CURRENT_TIMESTAMP(3); ALTER TABLE user CHANGE gmt_modified gmt_modified datetime(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3);

MODIFY关键字只能修改列类型和默认值,而CHANGE可以修改列名,所以CHANGE后跟两个gmt_create,第一个gmt_create是旧列名,第二个gmt_create是新列名. 若列类型为datetime(3),则默认值也必须是CURRENT_TIMESTAMP(3).若设置默认值为CURRENT_TIMESTAMP(),则报错 1067 - Invalid default value for 'gmt_create' 为gmt_modified设置UPDATE时更新列值为当前时间需要增加语句ON UPDATE CURRENT_TIMESTAMP(3)

gmt_create设置:
这里写图片描述
gmt_modified设置:
这里写图片描述

总结

其实之前也遇到过这个问题,也记录到文档中,但是没有写到博客中,导致今天又浪费了一个小时的时间解决这个问题,特此记录.
1. datetime(3)类型的默认值为CURRENT_TIMESTAMP(3)而不是CURRENT_TIMESTAMP().切记!!!
2. mysql5.5及之前版本只支持timestamp类型设置默认值为CURRENT_TIMESTAMP,不支持datetime类型默认值设置为CURRENT_TIMESTAMP

<think>嗯,用户想在MySQL5.7中设置字段的默认值为当前日期,也就是CURRENT_DATE或者NOW()的日期部分。我需要先确认MySQL5.7是否支持这个功能。根据之前的引用,比如引用1提到,MySQL8.0.13之后才允许Date字段默认设置CURRENT_DATE,而之前的版本不行。用户用的是5.7,显然低于8.0.13,所以直接设置DEFAULT CURRENT_DATE应该不行,会报错。那怎么办呢?用户可能需要其他方法来实现。记得在旧版本中,通常使用TIMESTAMP类型,但TIMESTAMP只能有一个自动初始化,而且存储的是日期时间,不是单纯的日期。不过用户可能只需要日期部分,所以或许可以用触发器或者用DATETIME类型配合默认值,但5.7的DATETIME在5.6.5之后支持自动初始化,但需要检查具体版本。用户提到的是5.7,所以可能5.7支持DATETIME默认值吗?根据引用3,5.6.5开始支持TIMESTAMPDATETIME的自动初始化,但每个表只能有一个TIMESTAMP有这样的特性。但用户想要的是DATE类型,所以可能需要替代方案。可能的解决方案包括:使用TIMESTAMP字段,然后取DATE部分;或者在插入时使用触发器自动填充日期。比如,创建一个BEFORE INSERT触发器,在插入时如果字段为NULL,就设置CURRENT_DATE。或者使用虚拟生成,但虚拟可能需要基于其他的表达式,可能不太直接。 另外,用户可能不想修改应用层代码,所以触发器可能是比较好的方法。不过触发器会增加数据库的负担,需要考虑性能。另外,是否可以使用默认值CURRENT_DATE的函数,比如用DATE(NOW()),但MySQL不允许函数作为DATE类型默认值,除了TIMESTAMPDATETIME在特定情况下。 总结一下步骤:首先确认MySQL5.7不支持直接设置DATE类型默认值CURRENT_DATE,然后提供替代方法,比如使用触发器或在插入时显式指定值。此外,可以建议升级到更高版本,如果可能的话。需要确保回答准确,并给出具体的SQL示例,比如创建表时使用触发器的方法。</think>### MySQL 5.7 设置字段默认值为当前日期的方法 #### 1. **直接设置`DATE`字段默认值的问题** 在MySQL 5.7中,直接为`DATE`类型字段设置`DEFAULT CURRENT_DATE`会报错,因为该版本不支持此语法[^1]。例如: ```sql CREATE TABLE example ( create_date DATE DEFAULT CURRENT_DATE -- 报错:语法不支持 ); ``` #### 2. **替代方案** 以下提供两种可行的解决方案: ##### **方案1:使用`TIMESTAMP`或`DATETIME`字段** MySQL 5.7允许为`TIMESTAMP`或`DATETIME`字段设置默认值为当前时间,但需注意: - **`TIMESTAMP`字段**:自动初始化和更新为当前时间,但每个表只能有一个`TIMESTAMP`字段有此特性[^3]。 - **`DATETIME`字段**:从MySQL 5.6.5开始支持自动初始化,但需明确指定默认值。 ```sql CREATE TABLE example ( create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 存储日期+时间 create_date DATE AS (DATE(create_time)) -- 通过生成提取日期部分 ); ``` - **说明**:通过`TIMESTAMP`存储完整时间,再使用生成(Generated Column)提取日期部分[^2]。 ##### **方案2:通过触发器自动填充日期** 若必须使用`DATE`类型字段,可通过触发器在插入时自动填充当前日期: ```sql -- 创建表时定义字段(无默认值) CREATE TABLE example ( create_date DATE ); -- 创建BEFORE INSERT触发器 DELIMITER $$ CREATE TRIGGER set_default_date BEFORE INSERT ON example FOR EACH ROW BEGIN IF NEW.create_date IS NULL THEN SET NEW.create_date = CURRENT_DATE; END IF; END$$ DELIMITER ; ``` - **效果**:插入数据时若未指定`create_date`,自动填充当前日期。 #### 3. **插入数据时的显式赋值** 若无法修改表结构,可在插入时手动赋值: ```sql INSERT INTO example (create_date) VALUES (CURRENT_DATE); ``` #### 4. **升级MySQL版本的建议** 从MySQL 8.0.13开始,支持直接为`DATE`字段设置`DEFAULT (CURRENT_DATE)`[^1],例如: ```sql CREATE TABLE example ( create_date DATE DEFAULT (CURRENT_DATE) -- MySQL ≥8.0.13可用 ); ``` 若业务允许,升级到更高版本可简化操作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值