web-dev-qa-db-ja.com

UPDATEの後にUPDATEをトリガーしますか?

更新の時間を次のように記録するトリガーを作成したいと思います。

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列を更新しようとしたときに、トリガーを実行する別の更新イベントでもあることです。これにより、無限ループが発生し、機能しなくなります。

更新時間を対応する列に保存するにはどうすればよいですか?

テーブルには多くの列があるため、トリガーを使用します。更新時間を手動で設定しようとすると、多くのクエリを変更する必要があります。

13
Googlebot

代わりにBEFOREトリガーを使用し、値を割り当てるupdated列をNEW.updatedに設定します(これはUPDATEではなく単純な割り当てになります)。この方法では、追加のUPDATEsをトリガーしません。

トリガー本体は単純に次のようになります

SET NEW.updated = NOW()

通常、AFTERトリガーはotherテーブルの変更にのみ使用し、BEFOREは新しい(または更新された)行の変更に使用するか、DELETEを抑制します。

17
dezso

あなたの場合のように、レコードが変更されるたびに更新されたフィールドを変更したい場合は、トリガーは必要ありません。

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
);
1
Tobias Beuving