MySQL自动更新当前时间戳

1. 问题

碰到一个奇怪的问题,一个业务表当更新了其中几行后,这几行对应的列created_at(DATETIME)自动更新为当前时间。

2. 排查

  1. 第一感觉想到触发器,排查表并未有触发器。
  2. 打开表设计器,发现其中"更新"列对应created_at打了勾。在这里插入图片描述

3. 分析

3.1 功能

可以自动更新列为当前日期时间,即当前时间戳。

3.2 语法

ON UPDATE CURRENT_TIMESTAMP,可以用于以下类型

  • DATETIME
  • TIMESTAMP
    备注:确认不能用于DATE类型。

用于INT、VARCHAR报出类似以下的错误
错误代码: 1294
Invalid ON UPDATE clause for ‘status’ column

3.2.1 CREATE
CREATE TABLE `test_table` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注' ,
  `created_at` DATETIME NULL COMMENT '创建时间' ON UPDATE CURRENT_TIMESTAMP, 
  PRIMARY KEY (`id`)
) ENGINE=INNODB COMMENT='test_table;';
3.2.2 UPDATE

3.2.2.1 删除

ALTER TABLE test_table CHANGE created_at created_at DATETIME NULL COMMENT '创建时间';

3.2.2.2 增加

ALTER TABLE test_table CHANGE created_at created_at DATETIME NULL COMMENT '创建时间' ON UPDATE CURRENT_TIMESTAMP;
MySQL 中,获取当前时间以及时间戳可以通过不同的函数实现,它们之间存在一些关键区别: - `NOW()` 和 `SYSDATE()` 是用于获取当前日期和时间的函数。`NOW()` 返回的是语句开始执行的时间,而 `SYSDATE()` 返回的是函数实际执行的时间[^3]。这意味着如果在 `NOW()` 被调用后有延迟(如通过 `SLEEP()` 函数),`NOW()` 的结果不会改变,但 `SYSDATE()` 的结果会反映实际经过的时间。 - `CURRENT_TIMESTAMP` 是另一个可以用来获取当前日期和时间的关键字,它等价于 `NOW()`,并且可以作为默认值和自动更新值用于 `TIMESTAMP` 类型的列[^2]。 - 如果需要获取以秒为单位的时间戳,可以使用 `UNIX_TIMESTAMP(NOW())`,这将返回自 1970-01-01 00:00:00 UTC 至今的秒数[^2]。 - 对于更高精度的时间戳,例如需要毫秒或微秒级别的记录,则可以使用 `SYSDATE(3)` 或 `SYSDATE(6)` 来获取包含小数秒的时间值[^3]。 下面是一些示例代码来演示这些函数的用法: ```sql -- 获取当前日期和时间 SELECT NOW(), SYSDATE(); -- 获取当前日期和时间(与 NOW() 相同) SELECT CURRENT_TIMESTAMP; -- 获取当前时间戳(秒级) SELECT UNIX_TIMESTAMP(NOW()); -- 获取当前时间(包含小数秒) SELECT SYSDATE(3); -- 可能输出类似 '2024-05-24 11:45:32.123' ``` 请注意,`NOW()` 和 `CURRENT_TIMESTAMP` 在大多数情况下是等效的,但是 `CURRENT_TIMESTAMP` 可以被用作列的默认值和自动更新值,这是 `NOW()` 所不具备的功能。 另外,`UNIX_TIMESTAMP()` 函数返回的是一个整数值,表示从 Unix 纪元到现在的秒数,这对于需要跨平台共享时间数据或者进行时间计算时非常有用。 当处理时间戳时,还需要注意时区的问题。MySQL 服务器可以在不同的时区设置下运行,因此在处理时间戳时应当确保了解服务器的时区配置,以便正确地转换和显示时间[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值