有没有办法知道 MySQL 表的数据是否已被修改?
问问题
3432 次
2 回答
2
您可以查询INFORMATION_SCHEMA 数据库、表TABLES
并且有一列“UPDATE_TIME”。(SHOW TABLES
有点等价)。
另一种方法是让 PHP 访问 db 文件(如果你能找到它们)并检查文件修改的系统日期。EDIT读取权限足以完成此操作。
于 2013-06-06T21:39:01.403 回答
2
在与@Voitcus 聊天时,我们发现该information_schema
方法不适用于InnoDb
表格。该列UPDATE_TIME
将NULL
用于此类表。
这就是为什么我们为InnoDB
不需要对硬盘上的 db 文件进行读取访问的表制定了一个解决方案(我认为这是一个安全问题,没有管理员应该允许这样做,数据库服务器也可以在不同的主机上)
解决方案:
正如您所说,您不能为此使用触发器函数,您必须在 PHP 中的应用程序级别修复此问题。更新:请注意,对于当前版本的 MySQL,无论如何使用触发器都不稳定,因为它们不会被级联外键操作调用。
首先创建一个表,让我们说stats
:
CREATE TABLE `yourdb`.`stats` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`table_name` VARCHAR( 255 ) NOT NULL ,
`last_update` DATETIME NOT NULL
) ENGINE = InnoDB;
为应用程序中的每个表插入一行。
在 PHP 中修改现有查询,以便它们使用事务并更新 stats 表。例如,这可以使用mysqli
或PDO
。我在PDO
这里使用,我们以删除一行为例。
try {
$pdo = new PDO($host, $user, $pass, $db, array((
// this option is nice when working with transactions
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
));
} catch (PDOException $e) {
die('cannot connect to mysql');
}
try {
// start transaction
$pdo->beginTransaction();
// delete a row
$pdo->query('DELETE FROM `table1` WHERE `id` = 1');
// update stats
$pdo->query('UPDATE `stats` SET `last_update` = NOW() WHERE `table_name` = `table1`');
// commit both queries at once
$pdo->commit();
} catch (Exception $e) {
// rollback both queries if one of them failed
$pdo->rollback();
}
现在您可以使用以下查询来获取上次更新时间:
SELECT `last_updated` FROM `stats` WHERE `table_name` = 'table1'
于 2013-06-08T22:40:14.843 回答