MySQLで過去1時間以内に更新されたテーブルを検索する方法
MySQLで「過去1時間以内に変更されたテーブル」を調べたい場合、INFORMATION_SCHEMA.TABLES を利用することで実現できます。ポイントは、DATE_SUB() 関数と INTERVAL を組み合わせて、現在時刻から1時間前の時刻を求め、それを UPDATE_TIME と比較する点です。
基本構文
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE DATE_SUB(NOW(), INTERVAL 1 HOUR) < UPDATE_TIME;
過去1時間に更新されたテーブル名を取得する
実際に、過去1時間以内に変更されたテーブルを検索するクエリが以下です。
mysql> SELECT TABLE_NAME FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE
-> DATE_SUB(NOW(), INTERVAL 1 HOUR) < `UPDATE_TIME`;実行結果
+---------------------+ | TABLE_NAME | +---------------------+ | innodb_table_stats | | innodb_index_stats | | employeeinformation | +---------------------+ 3 rows in set (0.37 sec)
このクエリではテーブル名のみを取得しています。もしスキーマ名やテーブルタイプなど、より詳細な情報が必要な場合は、次のクエリを使用します。
詳細情報も含めて取得する
カラムを指定せず SELECT * を使うことで、過去1時間以内に更新されたテーブルの全情報を表示できます。
mysql> SELECT *
-> FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE
-> DATE_SUB(NOW(), INTERVAL 1 HOUR) < `UPDATE_TIME`;実行結果
+---------------+--------------+---------------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+---------------------------------------+---------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT | +---------------+--------------+---------------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+---------------------------------------+---------------+ | def | mysql | innodb_table_stats | BASE TABLE | InnoDB | 10 | Dynamic | 449 | 145 | 65536 | 0 | 0 | 4194304 | NULL | 2018-09-22 20:37:26 | 2018-12-24 15:13:41 | NULL | utf8_bin | NULL | row_format=DYNAMIC stats_persistent=0 | | | def | mysql | innodb_index_stats | BASE TABLE | InnoDB | 10 | Dynamic | 1413 | 243 | 344064 | 0 | 0 | 4194304 | NULL | 2018-09-22 20:37:26 | 2018-12-24 15:13:41 | NULL | utf8_bin | NULL | row_format=DYNAMIC stats_persistent=0 | | | def | test | employeeinformation | BASE TABLE | InnoDB | 10 | Dynamic | 6 | 2730 | 16384 | 0 | 0 | 0 | NULL | 2018-12-24 15:12:04 | 2018-12-24 15:14:00 | NULL | utf8mb4_0900_ai_ci | NULL | | | +---------------+--------------+---------------------+------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+---------------------------------------+---------------+ 3 rows in set (43.72 sec)
補足:UPDATE_TIME の注意点
INFORMATION_SCHEMA.TABLES の UPDATE_TIME カラムは、InnoDB テーブルの場合、DML操作(INSERT・UPDATE・DELETE)によって必ずしも即座に更新されるわけではない点に注意してください。特に古いバージョンのMySQLでは、InnoDB のメタデータキャッシュの影響で正確な更新時刻が反映されないことがあります。確実な監視が必要な場合は、トリガーや binlog の活用も検討するとよいでしょう。
-
【Android】SQLiteで過去1時間以内に変更されたデータを検索する方法
AndroidにおけるSQLiteデータベースとは 本題に入る前に、AndroidにおけるSQLiteデータベースについて簡単におさらいしておきましょう。SQLiteはオープンソースのSQLデータベースで、デバイス上のテキストファイルにデータを保存します。Androidには標準でSQLiteの実装が組み込まれており、リレーショナルデータベースの機能を一通りサポートしています。さらに、JDBCやODBCのような接続処理を確立する必要がなく、手軽にデータベースへアクセスできる点も大きな特徴です。 この記事では、AndroidのSQLiteで「過去1時間以内に変更(登録・更新)されたデータ」を検索す
-
MySQLでデータベース内のテーブル数を表示するクエリの書き方
INFORMATION_SCHEMA.TABLESを使ってテーブル数を取得するここでは例として、「WEB」というデータベースを使用しているものとします。このデータベース内に存在するテーブルの総数を調べたい場合、MySQLではINFORMATION_SCHEMA.TABLESを利用するのが便利です。INFORMATION_SCHEMAは、MySQLサーバーが管理しているメタデータ(データベース名、テーブル名、カラム情報など)を格納する仮想データベースであり、これを参照することでスキーマに関する情報をSQLで簡単に取得できます。テーブル数を表示するクエリ「WEB」データベース内のテーブル数を表示す