Answers:
在更高版本的MySQL中,您可以使用information_schema
数据库来告诉您何时更新了另一个表:
SELECT UPDATE_TIME
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'dbname'
AND TABLE_NAME = 'tabname'
这当然意味着打开与数据库的连接。
另一种选择是每当更新MySQL表时“触摸”特定文件:
关于数据库更新:
O_RDRW
模式下打开您的时间戳文件close
再来一次或者
touch()
等效的PHP utimes()
来更改文件时间戳。在页面上显示:
stat()
回读文件修改时间。show table status
使用information_schema.tables
)
UPDATE_TIME
方法和以下show table status
方法仅适用于MyISAM引擎,不适用于InnoDB。尽管这被列为bug,但在MySQL 5.5 Reference中已提及,该参考书还指出该file_per_table
模式是修改时间的不可靠指标。
我没有使用MySQL 4.1.16版的information_schema数据库,因此在这种情况下,您可以查询以下内容:
SHOW TABLE STATUS FROM your_database LIKE 'your_table';
它将返回以下列:
| 姓名| 引擎| 版本| 行格式| 行| Avg_row_length
| 数据长度| 最大数据长度| 索引长度| 无数据| 自动递增
| 创建时间| 更新时间 | 检查时间| 整理
| 校验和 Create_options | 评论|
如您所见,有一列称为“ Update_time ”,它显示了your_table的最后更新时间。
我很惊讶没有人建议跟踪每行的最后更新时间:
mysql> CREATE TABLE foo (
id INT PRIMARY KEY
x INT,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
KEY (updated_at)
);
mysql> INSERT INTO foo VALUES (1, NOW() - INTERVAL 3 DAY), (2, NOW());
mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x | updated_at |
+----+------+---------------------+
| 1 | NULL | 2013-08-18 03:26:28 |
| 2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+
mysql> UPDATE foo SET x = 1234 WHERE id = 1;
即使我们在UPDATE中没有提及时间戳,它也会更新时间戳。
mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x | updated_at |
+----+------+---------------------+
| 1 | 1235 | 2013-08-21 03:30:20 | <-- this row has been updated
| 2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+
现在您可以查询MAX()了:
mysql> SELECT MAX(updated_at) FROM foo;
+---------------------+
| MAX(updated_at) |
+---------------------+
| 2013-08-21 03:30:20 |
+---------------------+
诚然,这需要更多的存储空间(TIMESTAMP每行4个字节)。
但这不适用于MySQL 5.7.15之前的InnoDB表,INFORMATION_SCHEMA.TABLES.UPDATE_TIME
事实并非如此。
最简单的方法是检查磁盘上表文件的时间戳。例如,您可以在数据目录下检查
cd /var/lib/mysql/<mydatabase>
ls -lhtr *.ibd
这应该为您提供所有表的列表以及该表的最早修改时间(最早的时间)。
有关最近表更改的列表,请使用以下命令:
SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME
UPDATE_TIME
都不为空?任何想法?
尽管有一个公认的答案,但我认为这不是正确的答案。这是实现所需功能的最简单方法,但是即使您在InnoDB中已启用它(实际上文档告诉您仍然应该获得NULL ...),如果您阅读MySQL 文档,即使在当前版本(8.0)中也使用UPDATE_TIME是不是正确的选择,因为:
重新启动服务器或从InnoDB数据字典高速缓存中清除表时,时间戳记不会保留。
如果我正确理解(现在无法在服务器上验证),则在服务器重新启动后时间戳会重置。
至于真正的(而且成本很高)的解决方案,您可以使用Bill Karwin的解决方案 CURRENT_TIMESTAMP,我想提出一个基于触发器(我正在使用该解决方案)。
首先创建一个单独的表(或者可能有其他可用于此目的的表),该表的工作方式类似于存储全局变量(此处为时间戳)。您需要存储两个字段-表名(或您要在此处保留的任何值作为表ID)和时间戳。获得它之后,应该使用此表ID +起始日期对其进行初始化(NOW()是一个不错的选择:))。
现在,您移至要观察的表,并通过以下步骤或类似过程在INSERT / UPDATE / DELETE之后添加触发器:
CREATE PROCEDURE `timestamp_update` ()
BEGIN
UPDATE `SCHEMA_NAME`.`TIMESTAMPS_TABLE_NAME`
SET `timestamp_column`=DATE_FORMAT(NOW(), '%Y-%m-%d %T')
WHERE `table_name_column`='TABLE_NAME';
END
如果您运行的是Linux,则可以使用inotify查看表或数据库目录。inotify可从PHP,node.js,perl获得,我怀疑大多数其他语言。当然,您必须已经安装了inotify或由ISP安装了它。很多ISP不会。
a)它会显示所有表格以及最近的更新日期
SHOW TABLE STATUS FROM db_name;
然后,您可以进一步要求提供特定表格:
SHOW TABLE STATUS FROM db_name like 'table_name';
b)如上例所示,您不能在“ Update_time”上使用排序,但是使用SELECT可以:
SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' ORDER BY UPDATE_TIME DESC;
进一步询问特定的表:
SELECT * FROM information_schema.tables WHERE TABLE_SCHEMA='db_name' AND table_name='table_name' ORDER BY UPDATE_TIME DESC';
这就是我所做的,希望对您有所帮助。
<?php
mysql_connect("localhost", "USER", "PASSWORD") or die(mysql_error());
mysql_select_db("information_schema") or die(mysql_error());
$query1 = "SELECT `UPDATE_TIME` FROM `TABLES` WHERE
`TABLE_SCHEMA` LIKE 'DataBaseName' AND `TABLE_NAME` LIKE 'TableName'";
$result1 = mysql_query($query1) or die(mysql_error());
while($row = mysql_fetch_array($result1)) {
echo "<strong>1r tr.: </strong>".$row['UPDATE_TIME'];
}
?>