MySQL 查詢表的末次更新時間update_time
阿新 • • 發佈:2019-01-11
背景: 執行環境: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 | +--------------+----------------------+---------------------+---------------------+