3

MySQL テーブルのデータが変更されたかどうかを知る方法はありますか?

4

2 に答える 2

2

@Voitcus とのチャットで、このinformation_schemaアプローチはInnoDbテーブルでは利用できないことがわかりました。列UPDATE_TIMENULLそのようなテーブル用になります。

そのため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 では、トランザクションを使用して統計テーブルを更新するように既存のクエリを変更します。これは、たとえばmysqliorを使用して可能です。ここでは、たとえば行を削除していますPDOPDO

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 に答える