mysql执行update语句一个时间字段(dateTime)根据当前时间自动填充

起因是程序执行存入数据库时间不对,程序把日期format为整时然后存入(或update)数据库,但是数据库一直存入的时间有分钟有秒,查看日志,跟代码,废了好大劲。查了资料,然后发现是navicat选择字段误点了根据当前时间戳更新,把取消掉就好了。

在这里插入图片描述

或者用sql来开启取消
MYSQL表里的DATETIME字段自动更新的设置与取消

1.先查看一下表的DDL语句

  `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `create_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',

当设置为ON UPDATE的时候就会自动更新
取消自动更新语句如下:

ALTER TABLE tab_name MODIFY COLUMN update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

结果:执行更新语句时,如果数据没有真正的改变,update_time值不变,只有数据值改变,update_time才会变成当前时间
设置自动更新语句如下:

ALTER TABLE tab_name  MODIFY COLUMN update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

### 如何在 XML 文件中通过 `<update>` 标签实现时间字段自动生成当前时间 为了使 `<update>` 标签中的时间字段能够自动生成当前时间,可以通过多种方式实现。以下是具体方法及其原理: #### 方法一:利用数据库特性 MySQL 提供了一种机制,在定义表结构时可以设置某些时间类型的字段(如 `TIMESTAMP` 或 `DATETIME`)为自动更新当前时间。当执行 `INSERT` 或 `UPDATE` 操作时,这些字段自动填充当前时间。 例如,在建表语句中可以这样定义: ```sql CREATE TABLE example_table ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), gmt_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间,默认值为当前时间 gmt_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间,每次修改记录都会更新为当前时间 ); ``` 这种方式无需额外配置即可满足需求[^1]。 #### 方法二:借助 MyBatis 的 MetaObjectHandler 如果希望在应用层控制时间字段的赋值逻辑,则可以在 MyBatis 中使用 `MetaObjectHandler` 接口来实现。通过重写该接口的方法,能够在插入或更新操作时动态注入当前时间。 以下是一个典型的实现示例: ```java @Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("gmtCreate", new Date(), metaObject); // 设置创建时间当前时间 this.setFieldValByName("gmtModified", new Date(), metaObject); // 设置更新时间当前时间 } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("gmtModified", new Date(), metaObject); // 仅更新时间当前时间 } } ``` 在此基础上,还需要确保实体类的相关字段被标记为可自动填充,通常通过 `@TableField(fill = FieldFill.INSERT_UPDATE)` 注解完成[^2]。 #### 方法三:直接在 Mapper XML 配置中处理 对于更复杂的场景,可以直接在 MyBatis 的 Mapper XML 文件中指定时间字段的行为。虽然这种方法不如上述两种灵活,但在特定情况下依然有效。 假设有一个名为 `example_table` 的表,其对应的映射文件可能如下所示: ```xml <update id="updateExample"> UPDATE example_table SET name = #{name}, gmt_modified = NOW() <!-- 使用 SQL 函数 NOW() 来生成当前时间 --> WHERE id = #{id} </update> ``` 这里的关键在于使用了 MySQL 的内置函数 `NOW()`,它会在运行时返回服务器上的当前日期和时间[^3]。 --- ### 总结 以上三种方法分别对应不同的技术层次: - 数据库层面通过 DDL 定义字段行为; - 应用框架层面通过 MyBatis 的扩展功能实现自动化; - 手动编写 SQL 利用数据库自带的功能完成目标。 每种方案都有各自的适用范围和优缺点,请根据实际业务需求选择合适的策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值