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


13

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

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列を更新しようとすると、トリガーを実行する別の更新イベントでもあることです。これは無限ループを作成しますが、機能しません。

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

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

回答:


17

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

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

SET NEW.updated = NOW()

通常、AFTERトリガーは、他のテーブルのBEFORE変更、新しい(または更新された)行の変更、またはsuppressにのみ使用しますDELETE


1

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

次のように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
);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.