MySQL テーブルのデータが変更されたかどうかを知る方法はありますか?
2 に答える
@Voitcus とのチャットで、このinformation_schema
アプローチはInnoDb
テーブルでは利用できないことがわかりました。列UPDATE_TIME
はNULL
そのようなテーブル用になります。
そのためInnoDB
、ハードディスク上の db ファイルへの読み取りアクセスを必要としないテーブルの解決策を考え出しました (これはセキュリティ上の問題であり、管理者はこれを許可すべきではありません。また、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 では、トランザクションを使用して統計テーブルを更新するように既存のクエリを変更します。これは、たとえばmysqli
orを使用して可能です。ここでは、たとえば行を削除しています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'