背景:
运行环境:MySQL5.7 MySQL8.0
在生产环境上经常需要判断一个条记录是否更新,或者查看整个表的是否有数据更新。
按照行数据的末次更新需求:根据末次更新时间来做数据的增量更新;
根据库的数据更新需求:某些临时存放的表,删除过期保存的表。
针对行数据的末次更新:
1.可以使用MySQL自身的语法支持设置为此时间随着字段update、insert一起更新
此方法较为通用。
2.使用MySQL的触发器。
针对数据库表的更新:
若是InnoDB可以查看information_schema.tables 表进行查看,但是有部分表的update_time没有信息是NULL。
SELECT t.TABLE_SCHEMA, t.TABLE_NAME,t.CREATE_TIME,t.UPDATE_TIME FROM information_schema.TABLES t WHERE t.TABLE_SCHEMA ='temp';
--查询最近三个月没有数据变更的表:
SELECT t.TABLE_SCHEMA, t.TABLE_NAME,t.CREATE_TIME,t.UPDATE_TIME FROM information_schema.TABLES t WHERE t.TABLE_SCHEMA ='tempdb'
AND GREATEST(IFNULL(t.UPDATE_TIME,t.CREATE_TIME),t.CREATE_TIME) < DATE_SUB(NOW(),INTERVAL 3 MONTH);
由于部分表创建的时候没有更新时间,使用MySQL官方的提供的函数ifnull,若update_time 为NULL 则取create_time 的时间。
--上述示例:
--创建表:
mysql> create table t(id int not null auto_increment primary key,cityname varchar(20),createtime datetime not null default CURRENT_TIMESTAMP,LastModifyTime datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '末次更新时间');
--查看表的定义:
mysql> show create table t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`cityname` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`createtime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastModifyTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '末次更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)
--插入数据查看:
mysql> insert into t(id,cityname)values(1,'wuhan');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+----+----------+---------------------+---------------------+
| id | cityname | createtime | LastModifyTime |
+----+----------+---------------------+---------------------+
| 1 | wuhan | 2018-11-08 10:21:33 | 2018-11-08 10:21:33 |
+----+----------+---------------------+---------------------+
1 row in set (0.01 sec)
mysql> update t set cityname='shanghai' where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t;
+----+----------+---------------------+---------------------+
| id | cityname | createtime | LastModifyTime |
+----+----------+---------------------+---------------------+
| 1 | shanghai | 2018-11-08 10:21:33 | 2018-11-08 10:22:10 |
+----+----------+---------------------+---------------------+
1 row in set (0.00 sec)
--查看表的createtime、update_time:
mysql> SELECT t.TABLE_SCHEMA, t.TABLE_NAME,t.CREATE_TIME,t.UPDATE_TIME FROM information_schema.TABLES t WHERE t.TABLE_SCHEMA=database();
+--------------+----------------------+---------------------+---------------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_TIME | UPDATE_TIME |
+--------------+----------------------+---------------------+---------------------+
| test | sys_menu | 2018-06-07 18:17:26 | NULL |
| test | sys_role | 2018-06-07 18:17:20 | NULL |
| test | sys_user | 2018-06-07 18:17:15 | 2018-11-08 10:27:49 |
| test | t | 2018-11-08 10:20:59 | 2018-11-08 10:22:10 |
+--------------+----------------------+---------------------+---------------------+