1. 程式人生 > >MySQL 查詢表的末次更新時間update_time

MySQL 查詢表的末次更新時間update_time

背景:
執行環境: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 |
+--------------+----------------------+---------------------+---------------------+