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

डुप्लिकेट कुंजी अद्यतन पर सशर्त

आप ON DUPLICATE KEY में सामान्य sql कंस्ट्रक्शन का उपयोग कर सकते हैं वाक्य - विन्यास। तो एक सम्मिलन के दौरान सशर्त अद्यतन करने के लिए आप निम्न कार्य कर सकते हैं:

INSERT INTO tbl (hat, mittens, name) 
VALUES ('yellow','purple','jimmy')
ON DUPLICATE KEY UPDATE name = CASE WHEN name <> VALUES(name) 
                                    THEN VALUES(name) ELSE name END;

यह उस मूल्य को बदल देगा जो आपने सम्मिलित विवरण में प्रदान किया था जब यह पंक्ति में मौजूद चीज़ों से अलग होता है और मान को पहले से ही सेट कर देगा यदि यह नहीं बदला है और इसके परिणामस्वरूप MySQL पंक्ति को संरक्षित करने के लिए कुछ भी नहीं कर रहा है अंतिम_अपडेट टाइमस्टैम्प जैसा कि क्वास्नोई ने बताया।

यदि आप 100% सुनिश्चित करना चाहते हैं कि आप MySQL के व्यवहार पर भरोसा नहीं कर रहे हैं, जहां यह एक पंक्ति को अपडेट नहीं करता है यदि आप स्वयं के लिए कोई मान सेट करते हैं तो आप टाइमस्टैम्प को बाध्य करने के लिए निम्न कार्य कर सकते हैं:

INSERT INTO tbl (hat, mittens, name) 
VALUES ('yellow','purple','jimmy')
ON DUPLICATE KEY UPDATE name = CASE WHEN name <> VALUES(name) 
                                    THEN VALUES(name) ELSE name END
                      , last_update = CASE WHEN name <> VALUES(name) 
                                      THEN now() ELSE last_update END;

यह केवल last_update को अपडेट करेगा करने के लिए now() जब नाम बदल गया है तो यह MySQL को last_update . के मान को बनाए रखने के लिए कहेगा ।

साथ ही, स्टेटमेंट के ON DUPLICATE KEY सेक्शन में आप टेबल के कॉलम को उनके नाम से रेफर कर सकते हैं और VALUES(column_name) समारोह।

निम्नलिखित एक लॉग है जो दर्शाता है कि प्रदान किया गया अंतिम विवरण 4.1 पर भी काम करता है जहां अन्य संस्करण 5.0 में तय की गई बग के कारण काम नहीं करते हैं।

C:\mysql\bin>mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 4.1.22-community

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+----------+
| Database |
+----------+
| mysql    |
| test     |
+----------+
2 rows in set (0.00 sec)

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> CREATE TABLE `tbl` (
    -> `hat` varchar(11) default NULL,
    -> `mittens` varchar(11) default NULL,
    -> `name` varchar(11) default NULL,
    -> `stamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
    -> UNIQUE KEY `clothes` (`hat`,`mittens`)
    -> ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george');
Query OK, 1 row affected (0.00 sec)

mysql> select * from tbl;
+------+---------+--------+---------------------+
| hat  | mittens | name   | stamp               |
+------+---------+--------+---------------------+
| blue | green   | george | 2009-06-27 12:15:16 |
+------+---------+--------+---------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name='george';
Query OK, 2 rows affected (0.00 sec)

mysql> select * from tbl;
+------+---------+--------+---------------------+
| hat  | mittens | name   | stamp               |
+------+---------+--------+---------------------+
| blue | green   | george | 2009-06-27 12:15:30 |
+------+---------+--------+---------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO tbl (hat, mittens, name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name=CASE WHEN name <> VALUES(name) THEN VALUES(name) ELSE name END;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from tbl;
+------+---------+--------+---------------------+
| hat  | mittens | name   | stamp               |
+------+---------+--------+---------------------+
| blue | green   | george | 2009-06-27 12:15:42 |
+------+---------+--------+---------------------+
1 row in set (0.00 sec)

mysql> INSERT INTO tbl (hat,mittens,name) VALUES ('blue','green','george') ON DUPLICATE KEY UPDATE name = CASE WHEN name <> VALUES(name) THEN VALUES(name) ELSE name END, stamp = CASE WHEN name <> VALUES(name) THEN now() ELSE stamp END;
Query OK, 2 rows affected (0.00 sec)

mysql> select * from tbl;
+------+---------+--------+---------------------+
| hat  | mittens | name   | stamp               |
+------+---------+--------+---------------------+
| blue | green   | george | 2009-06-27 12:15:42 |
+------+---------+--------+---------------------+
1 row in set (0.00 sec)

mysql>

अगर आपके कोई प्रश्न हैं तो मुझे बताएं।

एचटीएच,

-डिपिन



  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. MySQL में डुप्लीकेट रिकॉर्ड डालने से कैसे बचें?

  3. MySQL ट्रिगर में INSERT ऑपरेशन को कैसे निरस्त करें?

  4. एक्सेल फ़ाइल को mysql डेटाबेस में कैसे बदलें?

  5. मैं एक स्टैक्ड बार में प्रत्येक दिनांक सीमा के लिए एकाधिक स्टैक्ड कॉलम कैसे प्रदर्शित करूं?