当前位置:Gxlcms > mysql > MySQL中同时存在创建和上次更新时间戳字段解决方法浅析

MySQL中同时存在创建和上次更新时间戳字段解决方法浅析

时间:2021-07-01 10:21:17 帮助过:15人阅读

在写这篇文章之前,明确我的MySQL版本。 mysqlgt; SELECT VERSION();+------------+| VERSION() |+------------+| 5.5.29-log

在写这篇文章之前,明确我的MySQL版本。

mysql> SELECT VERSION();
+------------+
| VERSION() |
+------------+
| 5.5.29-log |
+------------+
1 row in set (0.00 sec)

现在有这样的需求,一张表中有一个字段created_at记录创建该条记录的时间戳,,另一个字段updated_at记录更新该条记录的时间戳。

我们尝试以下几个语句。

第一个,测试通过。

CREATE TABLE temp
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

第二个,测试不通过。报ERROR 1293 (HY000)错误。(完整错误信息:ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause)

CREATE TABLE temp
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

MySQL 5.5.29中有这样的奇葩限制,不明白为什么。既然有这样的限制,那么只有绕道而行,现在尝试给出如下几种解决办法。

第一种,created_at使用DEFAULT CURRENT_TIMESTAMP或者DEFAULT now(),updated_at使用触发器。

具体解决方法如下:

1.temp表结构如下:

CREATE TABLE temp
(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP,
updated_at timestamp NULL
);

2.插入测试数据:

3.在temp上创建触发器,实现更新时记录更新时间;

delimiter |
DROP TRIGGER IF EXISTS tri_temp_updated_at;
CREATE TRIGGER tri_temp_updated_at BEFORE UPDATE ON temp
FOR EACH ROW
BEGIN
SET NEW.updated_at = now();
END;
|
delimiter ;

4.测试。

更多详情见请继续阅读下一页的精彩内容:

linux

人气教程排行