Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL ट्रिगर अपडेट के बाद ही अगर पंक्ति बदल गई है

वर्कअराउंड के रूप में, आप टाइमस्टैम्प (पुराने और नए) का उपयोग यह जाँचने के लिए कर सकते हैं कि वह नहीं है। अद्यतन किया जाता है जब पंक्ति में कोई परिवर्तन नहीं होता है। (संभवतः यह भ्रम का स्रोत है? क्योंकि उस को 'अपडेट पर' भी कहा जाता है लेकिन जब कोई परिवर्तन नहीं होता है तो निष्पादित नहीं होता है) एक सेकंड के भीतर परिवर्तन ट्रिगर के उस हिस्से को निष्पादित नहीं करेगा, लेकिन कुछ मामलों में जो ठीक हो सकता है (जैसे कि जब आपके पास कोई ऐसा एप्लिकेशन हो जो किसी भी तरह तेजी से बदलाव को अस्वीकार करता हो।)

उदाहरण के लिए, के बजाय

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 |
+-------+-----------+------+-----+-------------------+-----------------------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में कॉलम का डिफ़ॉल्ट मान कैसे निकालें

  2. XML_LOAD() का उपयोग करके XML फ़ाइल को MySQL डेटाबेस तालिका में कैसे आयात करें; समारोह

  3. माइक्रोसेकंड () उदाहरण – MySQL

  4. उपयोगकर्ता के लिए MySQL सर्वर को रिमोट एक्सेस अनुमतियां कैसे दें?

  5. MySQL में अपरकेस अक्षरों वाली पंक्तियों को खोजने के 3 तरीके