web-dev-qa-db-ja.com

列の最終更新時刻を取得します

このコマンドは、テーブルの最終更新日を示します

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'MyDB'
AND TABLE_NAME = 'MyTable'

しかし、テーブルの特定の列が最後に更新された時刻を知りたいのですが。システムテーブルから特定の列が最後に更新された時刻を知りたいので、トリガーを使用できません。

私の問題をうまく説明できたらいいのですが。

6
Fox

そのような情報がどこかに記録されているシステムテーブル(つまり、 INFORMATION_SCHEMAデータベースに何も存在しない )は存在しません。つまり、列の変更にタイムスタンプを付けるネイティブのメカニズムはありません。いつでも

  • 任意の行で1つ以上の列が変化する
  • 新しい行が追加されます
  • 古いが削除されます
  • 任意の種類のALTER TABLE

UPDATE_TIMEの列INFORMATION_SCHEMA.TABLES が更新されました。

提案

これは飲み込むのに苦い錠剤かもしれませんが、次のことを行う必要があります。

  • 記録するカスタムテーブルを作成します
    • 主キー
    • 列名
    • その列の古い値
    • その列の新しい値
    • 変更のタイムスタンプ
  • 作成BEFORE UPDATEトリガーして新旧の列を比較し、一致しない場合は記録します

エピローグ

いくつかのテーブルといくつかの列をカスタマイズしている場合、これはそれほど悪くないかもしれません。

6
RolandoMySQLDBA

あなたができることは、テーブルが更新されるたびにタイムスタンプを保存するようにテーブルを変更することです。例えば

CREATE TABLE foo (
  id INT PRIMARY KEY
  x INT,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
                     ON UPDATE CURRENT_TIMESTAMP,
  KEY (updated_at)
);

上記のコードは、現在のタイムスタンプを新しい行に格納し、行が編集されるたびに編集された時刻を変更します。このようにして、データを取得し、並べ替えることができます(order bydescendingモードで、トップレコードを取得します。このようにして、テーブルで最後に更新されたレコードを取得します。データベース全体について知りたい場合は、各テーブルの最後に更新されたレコードを比較して、最新のレコードを取得する必要があります。

3
John Demetriou