在我的页脚,我想添加一些东西,如“上次更新xx/xx/200x”,这个日期是最后一次某个mySQL表已更新。
最好的方法是什么?是否有检索最近更新日期的函数?每次需要这个值时,我都应该访问数据库吗?
在我的页脚,我想添加一些东西,如“上次更新xx/xx/200x”,这个日期是最后一次某个mySQL表已更新。
最好的方法是什么?是否有检索最近更新日期的函数?每次需要这个值时,我都应该访问数据库吗?
当前回答
不知道你会不会对这个感兴趣。在mysql和客户端之间使用mysqlproxy,并使用lua脚本根据有趣的表变化更新memcached中的键值update,DELETE,INSERT是我最近做的解决方案。如果包装器支持php中的钩子或触发器,这可能会更容易。到目前为止,没有一个包装器这样做。
其他回答
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';
对于最近的表更改列表,使用这个:
SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME
不知道你会不会对这个感兴趣。在mysql和客户端之间使用mysqlproxy,并使用lua脚本根据有趣的表变化更新memcached中的键值update,DELETE,INSERT是我最近做的解决方案。如果包装器支持php中的钩子或触发器,这可能会更容易。到目前为止,没有一个包装器这样做。
虽然有一个公认的答案,但我不认为它是正确的答案。这是实现所需的最简单的方法,但即使已经在InnoDB中启用(实际上文档告诉你,你仍然应该得到NULL…),如果你阅读MySQL文档,即使在当前版本(8.0)使用UPDATE_TIME也不是正确的选择,因为:
方法重新启动服务器时,时间戳不会持久 表从InnoDB数据字典缓存中被清除。
如果我理解正确(现在不能在服务器上验证),时间戳在服务器重新启动后会重置。
至于真正的(以及昂贵的)解决方案,你有Bill Karwin的解决方案与CURRENT_TIMESTAMP,我想提出一个不同的解决方案,这是基于触发器(我正在使用那个)。
首先创建一个单独的表(或者可能有其他可以用于此目的的表),它将像存储全局变量(这里是时间戳)一样工作。您需要存储两个字段——表名(或者您想保留在这里作为表id的任何值)和时间戳。在你拥有它之后,你应该用这个表id +开始日期来初始化它(NOW()是一个很好的选择:))。
现在,你移动到你想要观察的表,并使用以下或类似的过程添加触发器AFTER 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
和其他人一样,但是我使用了一些条件,以节省时间:
SELECT
UPDATE_TIME,
TABLE_SCHEMA,
TABLE_NAME
FROM
information_schema.tables
WHERE
1 = 1
AND UPDATE_TIME > '2021-11-09 00:00:00'
AND TABLE_SCHEMA = 'db_name_here'
AND TABLE_NAME not in ('table_name_here',)
ORDER BY
UPDATE_TIME DESC,
TABLE_SCHEMA,
TABLE_NAME;