MySQL トリガー: 実際のデータ変更を検出
MySQL トリガーは、データが変更されたときに特定の操作を実行するために使用されます。ただし、重要なデータ変更のみがアクションをトリガーする場合、データが実際に変更されたかどうかを判断することが困難になります。 NEW
キーワードと OLD
キーワードを使用すると列レベルの比較が可能ですが、多数の列を持つテーブルでは、単一の比較に依存すると面倒になり、エラーが発生しやすくなります。
タイムスタンプベースのトリガー
この問題を解決する 1 つの方法は、タイムスタンプを利用してデータ変更が行われたかどうかを判断することです。 MySQL は、行が挿入または変更されると、タイムスタンプ列を現在時刻で自動的に更新します。新しいタイムスタンプと古いタイムスタンプを比較することで、変更が加えられたかどうかを判断できます。
実装方法
実際のデータが変更された場合にのみ実行されるトリガーを実装するには、次の手順を検討してください:
NEW
と OLD
の値を比較します。トリガー アクションは、タイムスタンプが異なる場合にのみ実行されます。 <code class="language-sql">CREATE TABLE foo ( a INT, b INT, ts TIMESTAMP ); CREATE TRIGGER ins_sum AFTER UPDATE ON foo FOR EACH ROW BEGIN IF NEW.ts != OLD.ts THEN INSERT INTO bar (a, b) VALUES(NEW.a, NEW.b); END IF; END;</code>
例
この例では、foo
テーブルにタイムスタンプを追跡するための追加の ts
列が含まれています。 ins_sum
トリガーは、更新された行のタイムスタンプが変更された場合にのみ、bar
テーブルにレコードを挿入するように構成されています。
<code class="language-sql">-- 向'foo'表插入初始数据 INSERT INTO foo (a, b) VALUES (1, 1), (2, 2), (3, 3); -- 更新'foo'表,但未进行任何更改 UPDATE foo SET b = 3 WHERE a = 3; -- 验证触发器未执行 SELECT * FROM bar; -- 输出:空集(未检索到任何行) -- 使用实际更改更新'foo'表 UPDATE foo SET b = 4 WHERE a = 3; -- 验证触发器已执行 SELECT * FROM bar; -- 输出:包含数据的行(触发器操作已完成)</code>
タイムスタンプを使用する利点
以上がMySQL トリガーは実際のデータ変更をどのように効率的に検出できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。