MySQL datetime数据类型设置当前时间为默认值

本文介绍在MySQL中如何为datetime或timestamp类型的字段设置默认值为当前时间。提供了两种方法:一是使用TIMESTAMP类型并利用其自动更新特性;二是通过触发器在插入记录时自动设置datetime字段的默认值。

        环境:MySQL Sever 5.1 + MySQL命令行工具


        问题:MySQL datetime数据类型设置当前时间为默认值

 

        解决:


        方法一:


         由于MySQL目前字段的默认值不支持函数,所以以create_time datetime default now() 的形式设置默认值是不可能的。代替的方案是使用TIMESTAMP类型代替DATETIME类型。 


         TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作。如果有多个TIMESTAMP列,只有第一个自动更新。 

         自动更新第一个TIMESTAMP列在下列任何条件下发生: 


         1.列值没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。

 

         2.列值没有明确地在一个UPDATE语句中指定且另外一些的列改变值。(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。) 


         3.你明确地设定TIMESTAMP列为NULL. 


         4.除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。 

 

         所以把日期类型 选择成timestamp 允许空就可以了 


CREATE TABLE test ( 
uname varchar(50) NOT NULL, 
updatetime timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


          如果要在navicat下操作的话,将字段设置为timestamp,然后默认值写上CURRENT_TIMESTAMP即可 

 

          方法二:


          在MySQL5.0以上版本中也可以使用trigger来实现此功能。 


create table test_time ( 
 idint(11), 
 create_time datetime 
); 
delimiter | 
create trigger default_datetime before insert on test_time 
  foreach row 
    if new.create_time is null then 
      set new.create_time = now(); 
    end if;| 
delimiter ; 


 

         参考资料:


         mysql 日期默认系统时间 mysql 默认值不支持函数


         MySQL的datetime设置当前时间为默认值


         MySQL里如何给日期类型设置默认值


         MySQL 字段约束 null,notnull,default,auto_increment





<think>好的,用户的问题是在MySQL 5.7中如何设置DATETIME类型字段的默认值当前日期时间。首先,我需要回忆一下MySQL版本更新带来的变化,尤其是关于默认值的限制。记得从5.7版本开始,MySQL引入了更严格的SQL模式,比如NO_ZERO_DATE和NO_ZERO_IN_DATE,这会导致设置默认值为'0000-00-00 00:00:00'时报错。所以用户可能遇到了类似的问题,现在想用当前时间作为默认值。 根据引用内容,用户可能之前尝试过设置默认值为零日期,但遇到了错误。现在正确的做法应该是使用CURRENT_TIMESTAMP作为默认值。不过需要注意,在MySQL 5.6及以后,DATETIME和TIMESTAMP类型都可以使用CURRENT_TIMESTAMP作为默认值,但TIMESTAMP的范围较小,只到'2038-01-19',而DATETIME的范围更大。因此,用户需要根据需求选择合适的数据类型。 接下来,我需要检查如何正确设置默认值当前时间。根据引用中的示例,比如引用[2]中的ALTER TABLE语句,使用DEFAULT CURRENT_TIMESTAMP来设置DATETIME列的默认值。这应该适用于MySQL 5.7,只要SQL模式允许。同时,用户可能需要确认sql_mode是否包含相关限制,如引用[4]提到的NO_ZERO_DATE等,但设置当前时间应该不受这些模式的影响。 然后,总结步骤:在创建表时,对于DATETIME类型的列,使用DEFAULT CURRENT_TIMESTAMP;或者在已有表中通过ALTER TABLE添加列时指定默认值。同时,如果有需要,可以使用ON UPDATE CURRENT_TIMESTAMP来自动更新时间戳。 此外,用户可能需要知道TIMESTAMP和DATETIME的区别,比如存储空间和范围,以便做出合适的选择。还需要注意在5.7版本中,每个表只能有一个TIMESTAMP列自动初始化和更新,但DATETIME不受此限制。 最后,生成相关问题,涵盖默认值设置、错误解决、数据类型选择等,帮助用户进一步了解相关主题。</think>### MySQL 5.7设置DATETIME默认值当前时间 #### 1. **直接使用`CURRENT_TIMESTAMP`** 在MySQL 5.7中,可以直接为`DATETIME`或`TIMESTAMP`类型的字段设置默认值当前时间,语法如下: ```sql -- 创建表时设置默认值 CREATE TABLE example ( id INT PRIMARY KEY, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- 修改已有表字段 ALTER TABLE example ADD COLUMN regdate DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'; ``` - **`CURRENT_TIMESTAMP`** 表示字段的默认值当前系统时间。 - **`ON UPDATE CURRENT_TIMESTAMP`** 会在数据更新时自动刷新时间(仅适用于`TIMESTAMP`类型)[^2][^4]。 --- #### 2. **注意事项** - **`DATETIME`与`TIMESTAMP`区别**: - `DATETIME`范围:`1000-01-01 00:00:00`到`9999-12-31 23:59:59`,存储空间8字节。 - `TIMESTAMP`范围:`1970-01-01 00:00:01`到`2038-01-19 03:14:07`,存储空间4字节,且与时区相关。 - **SQL模式限制**: 若尝试设置默认值为`0000-00-00 00:00:00`,需检查`sql_mode`是否包含`NO_ZERO_IN_DATE`或`NO_ZERO_DATE`。可通过以下命令调整: ```sql SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; ``` 但建议优先使用有效时间值(如`CURRENT_TIMESTAMP`)避免冲突[^3]。 --- #### 3. **示例操作** **场景**:为表`orders`添加字段`order_date`,默认值当前时间: ```sql ALTER TABLE orders ADD COLUMN order_date DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '订单时间'; ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值