更新の時間を次のように記録するトリガーを作成したいと思います。
CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END
問題は、このトリガーがupdated
列を更新しようとしたときに、トリガーを実行する別の更新イベントでもあることです。これにより、無限ループが発生し、機能しなくなります。
更新時間を対応する列に保存するにはどうすればよいですか?
テーブルには多くの列があるため、トリガーを使用します。更新時間を手動で設定しようとすると、多くのクエリを変更する必要があります。
代わりにBEFORE
トリガーを使用し、値を割り当てるupdated
列をNEW.updated
に設定します(これはUPDATE
ではなく単純な割り当てになります)。この方法では、追加のUPDATE
sをトリガーしません。
トリガー本体は単純に次のようになります
SET NEW.updated = NOW()
通常、AFTER
トリガーはotherテーブルの変更にのみ使用し、BEFORE
は新しい(または更新された)行の変更に使用するか、DELETE
を抑制します。
あなたの場合のように、レコードが変更されるたびに更新されたフィールドを変更したい場合は、トリガーは必要ありません。
MySQLの自動初期化/更新を次のように使用できます。
ALTER TABLE `yourtabelname` ADD `updated` DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
または、テーブル作成時に ドキュメントから :
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);