Verhindern Sie, dass MySQL-Trigger in unveränderten Zeilen ausgeführt werden
MySQL-Trigger werden ausgeführt, wenn eine bestimmte Operation für eine Tabelle ausgeführt wird, z. B. ein Einfügen, Aktualisieren oder Löschen. Standardmäßig wird der „After Update“-Trigger jedoch auch dann aktiviert, wenn keine Änderungen an den Tabellenzeilen vorgenommen wurden.
Warum wird der „After Update“-Trigger ausgeführt, auch wenn keine Änderungen vorliegen?
Der normale Weg, Änderungen in einer aktualisierten Zeile zu erkennen, besteht darin, einzelne Spaltenwerte zwischen der „neuen“ und der „alten“ Version der Zeile zu vergleichen. Mit zunehmender Spaltenanzahl in der Tabelle wird dieser Ansatz jedoch mühsam und fehleranfällig.
Lösung: Nutzen Sie Zeilenzeitstempel, um Änderungen zu identifizieren
Eine gute Möglichkeit, dieses Problem zu lösen, ist die Verwendung einer Zeilenzeitstempelspalte. MySQL verwaltet zwei Spalten mit Zeitstempeln für jede Zeile: Erstellungszeitstempel und Aktualisierungszeitstempel. Diese Zeitstempel werden jedes Mal automatisch aktualisiert, wenn eine Zeile eingefügt oder aktualisiert wird.
Trigger-Ausführung basierend auf Zeitstempelvergleich
Durch den Vergleich der neuen und alten Zeitstempel können wir feststellen, ob Änderungen an der Zeile vorgenommen wurden. Der folgende Triggercode veranschaulicht diesen Ansatz:
<code class="language-sql">CREATE TRIGGER ins_sum AFTER UPDATE ON foo FOR EACH ROW BEGIN IF NEW.ts <> OLD.ts THEN -- 已进行更改;执行触发器主体 END IF; END;</code>
In diesem Trigger stellen „NEW.ts“ und „OLD.ts“ den neuen bzw. alten Zeitstempelwert dar. Sind die Werte unterschiedlich, liegt eine Änderung vor und der Trigger-Body wird ausgeführt.
Beispiel
Betrachten Sie das folgende Beispiel:
<code class="language-sql">CREATE TABLE foo (a INT, b INT, ts TIMESTAMP); -- 插入一些行 INSERT INTO foo (a, b) VALUES (1, 1); INSERT INTO foo (a, b) VALUES (2, 2); INSERT INTO foo (a, b) VALUES (3, 3); -- 触发器定义 DELIMITER /// 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; /// DELIMITER ; -- 不更改地更新 UPDATE foo SET b = 3 WHERE a = 3; -- 更改地更新 UPDATE foo SET b = 4 WHERE a = 3;</code>
Der Trigger wird nach der Durchführung des ersten Updates (ohne Änderungen vorzunehmen) nicht ausgeführt. Bei der zweiten Aktualisierung wird jedoch die Zeile geändert und der Trigger wird ausgeführt, wodurch die neue Zeile in die „Balken“-Tabelle eingefügt wird.
Diese Lösung macht den expliziten Vergleich einzelner Spaltenwerte überflüssig und stellt sicher, dass der Trigger nur dann ausgeführt wird, wenn eine tatsächliche Änderung an der Zeile vorgenommen wird.
Das obige ist der detaillierte Inhalt vonWie kann ich verhindern, dass MySQL-Trigger „AFTER UPDATE' auf unveränderte Zeilen ausgelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!