在我页面的页脚中,我想添加类似"上次更新xx/xx/200x"的内容,此日期是某个mySQL表最后一次更新的日期.
最好的方法是什么?是否有检索上次更新日期的功能?我每次需要这个值时都应该访问数据库吗?
在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()
回读文件修改时间.
我没有使用mysql 4.1.16版本的information_schema数据库,所以在这种情况下你可以查询:
SHOW TABLE STATUS FROM your_database LIKE 'your_table';
它将返回以下列:
| Name | Engine | Version | Row_format | Rows | Avg_row_length
| Data_length | Max_data_length | Index_length | Data_free | Auto_increment
| Create_time | Update_time | Check_time | Collation
| Checksum | Create_options | Comment |
正如你可以看到有一个名为列:" 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个字节).
但这适用于 5.7.15版MySQL之前的InnoDB表,INFORMATION_SCHEMA.TABLES.UPDATE_TIME
但没有.
最简单的方法是检查磁盘上表文件的时间戳.例如,您可以在数据目录下查看
cd /var/lib/mysql/ls -lhtr *.ibd
这应该为您提供所有表的列表,其中包含表在上次修改时的最早时间,第一个.
有关最近表更改的列表,请使用以下命令:
SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME FROM information_schema.tables ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME
我会创建一个触发器来捕获所有更新/插入/删除并在自定义表中写入时间戳,类似于tablename | 时间戳
仅仅因为我不喜欢直接读取db server的内部系统表的想法