वर्कअराउंड के रूप में, आप टाइमस्टैम्प (पुराने और नए) का उपयोग यह जाँचने के लिए कर सकते हैं कि वह नहीं है। अद्यतन किया जाता है जब पंक्ति में कोई परिवर्तन नहीं होता है। (संभवतः यह भ्रम का स्रोत है? क्योंकि उस को 'अपडेट पर' भी कहा जाता है लेकिन जब कोई परिवर्तन नहीं होता है तो निष्पादित नहीं होता है) एक सेकंड के भीतर परिवर्तन ट्रिगर के उस हिस्से को निष्पादित नहीं करेगा, लेकिन कुछ मामलों में जो ठीक हो सकता है (जैसे कि जब आपके पास कोई ऐसा एप्लिकेशन हो जो किसी भी तरह तेजी से बदलाव को अस्वीकार करता हो।)
उदाहरण के लिए, के बजाय
IF NEW.a <> OLD.a or NEW.b <> OLD.b /* etc, all the way to NEW.z <> OLD.z */
THEN
INSERT INTO bar (a, b) VALUES(NEW.a, NEW.b) ;
END IF
आप उपयोग कर सकते हैं
IF NEW.ts <> OLD.ts
THEN
INSERT INTO bar (a, b) VALUES(NEW.a, NEW.b) ;
END IF
फिर आपको हर बार योजना को अपडेट करने पर अपना ट्रिगर बदलने की ज़रूरत नहीं है (जिस मुद्दे का आपने प्रश्न में उल्लेख किया है।)
संपादित करें:पूरा उदाहरण जोड़ा गया
create table foo (a INT, b INT, ts TIMESTAMP);
create table bar (a INT, b INT);
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 ;
select * from foo;
+------+------+---------------------+
| a | b | ts |
+------+------+---------------------+
| 1 | 1 | 2011-06-14 09:29:46 |
| 2 | 2 | 2011-06-14 09:29:46 |
| 3 | 3 | 2011-06-14 09:29:46 |
+------+------+---------------------+
3 rows in set (0.00 sec)
-- UPDATE without change
UPDATE foo SET b = 3 WHERE a = 3;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
-- the timestamo didnt change
select * from foo WHERE a = 3;
+------+------+---------------------+
| a | b | ts |
+------+------+---------------------+
| 3 | 3 | 2011-06-14 09:29:46 |
+------+------+---------------------+
1 rows in set (0.00 sec)
-- the trigger didn't run
select * from bar;
Empty set (0.00 sec)
-- UPDATE with change
UPDATE foo SET b = 4 WHERE a=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
-- the timestamp changed
select * from foo;
+------+------+---------------------+
| a | b | ts |
+------+------+---------------------+
| 1 | 1 | 2011-06-14 09:29:46 |
| 2 | 2 | 2011-06-14 09:29:46 |
| 3 | 4 | 2011-06-14 09:34:59 |
+------+------+---------------------+
3 rows in set (0.00 sec)
-- and the trigger ran
select * from bar;
+------+------+---------------------+
| a | b | ts |
+------+------+---------------------+
| 3 | 4 | 2011-06-14 09:34:59 |
+------+------+---------------------+
1 row in set (0.00 sec)
यह टाइमस्टैम्प को संभालने पर mysql के व्यवहार के कारण काम कर रहा है। टाइम स्टैम्प केवल तभी अपडेट होता है जब अपडेट में कोई बदलाव होता है।
दस्तावेज़ीकरण यहाँ है:
https://dev .mysql.com/doc/refman/5.7/hi/timestamp-initialization.html
desc foo;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| a | int(11) | YES | | NULL | |
| b | int(11) | YES | | NULL | |
| ts | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+