gpt4 book ai didi

php - MySQL:检查表的数据是否已修改没有触发器和 UDF?

转载 作者:可可西里 更新时间:2023-11-01 08:06:16 34 4
gpt4 key购买 nike

有没有办法知道MySQL表的数据是否已被修改?

最佳答案

在与@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 中修改现有查询,以便它们使用事务并更新统计表。例如,这可以使用 mysqliPDO 来实现。我在这里使用 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'

关于php - MySQL:检查表的数据是否已修改没有触发器和 UDF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972495/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com