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

कैसे INSERT करें यदि पंक्ति मौजूद नहीं है (UPSERT) MySQL में

  • INSERT IGNORE का उपयोग करना
  • REPLACE का उपयोग करना
  • डुप्लिकेट कुंजी अद्यतन पर INSERT ... ON DUPLICATE KEY UPDATE

MySQL कई उपयोगी स्टेटमेंट प्रदान करता है जब INSERT . की आवश्यकता होती है पंक्तियाँ बाद यह निर्धारित करना कि क्या वह पंक्ति वास्तव में नई है या पहले से मौजूद है।

नीचे हम तीन अलग-अलग तरीकों की जांच करेंगे और बारी-बारी से प्रत्येक के पेशेवरों और विपक्षों की व्याख्या करेंगे, ताकि आपको INSERTION के लिए नया या संभावित मौजूदा डेटा प्रदान करते समय अपने स्वयं के कथनों को कॉन्फ़िगर करने के तरीके के बारे में अच्छी समझ हो। ।

INSERT IGNORE का उपयोग करना

INSERT IGNORE . का उपयोग करना प्रभावी रूप से MySQL को अनदेखा . का कारण बनता है INSERT करने का प्रयास करते समय निष्पादन त्रुटियां बयान। इसका मतलब है कि एक INSERT IGNORE स्टेटमेंट जिसमें एक UNIQUE . में डुप्लीकेट मान होता है अनुक्रमणिका या PRIMARY KEY फ़ील्ड नहीं एक त्रुटि उत्पन्न करते हैं, लेकिन इसके बजाय केवल उस विशेष INSERT . को अनदेखा कर देंगे पूरी तरह से आदेश। स्पष्ट उद्देश्य बड़ी संख्या में INSERT . को निष्पादित करना है डेटा के संयोजन के लिए स्टेटमेंट जो डेटाबेस में पहले से मौजूद है और साथ ही सिस्टम में आने वाला नया डेटा।

उदाहरण के लिए, हमारी books तालिका में पहले से ही कुछ रिकॉर्ड हो सकते हैं:

mysql> SELECT * FROM books LIMIT 3;
+----+-------------------------+---------------------+----------------+
| id | title                   | author              | year_published |
+----+-------------------------+---------------------+----------------+
|  1 | In Search of Lost Time  | Marcel Proust       |           1913 |
|  2 | Ulysses                 | James Joyce         |           1922 |
|  3 | Don Quixote             | Miguel de Cervantes |           1605 |
+----+-------------------------+---------------------+----------------+
3 rows in set (0.00 sec)

अगर हमारे पास INSERT . में नए और मौजूदा डेटा का एक बड़ा बैच है और उस डेटा के हिस्से में id . के लिए एक मिलान मान होता है फ़ील्ड (जो एक UNIQUE है PRIMARY_KEY तालिका में), एक बुनियादी INSERT . का उपयोग करके अपेक्षित त्रुटि उत्पन्न करेगा:

mysql> INSERT INTO books
    (id, title, author, year_published)
VALUES
    (1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

दूसरी ओर, यदि हम INSERT IGNORE . का उपयोग करते हैं , दोहराव के प्रयास को नज़रअंदाज कर दिया जाता है और कोई परिणामी त्रुटि नहीं होती है:

mysql> INSERT IGNORE INTO books
    (id, title, author, year_published)
VALUES
    (1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 0 rows affected (0.00 sec)

REPLACE का उपयोग करना

उस स्थिति में जब आप वास्तव में प्रतिस्थापित . करना चाहते हैं पंक्तियाँ जहाँ INSERT डुप्लिकेट UNIQUE . के कारण कमांड त्रुटियाँ उत्पन्न करेंगे या PRIMARY KEY ऊपर बताए गए मानों के लिए, एक विकल्प REPLACE . को चुनना है बयान।

REPLACE issuing जारी करते समय कथन, जारी किए गए प्रत्येक आदेश के लिए दो संभावित परिणाम हैं:

  • मिलान मानों वाली कोई मौजूदा डेटा पंक्ति नहीं मिली और इस प्रकार एक मानक INSERT बयान किया जाता है।
  • मिलती-जुलती डेटा पंक्ति है पाया गया, जिससे मौजूदा पंक्ति को मानक DELETE . के साथ हटा दिया गया कथन, फिर एक सामान्य INSERT बाद में किया जाता है।

उदाहरण के लिए, हम REPLACE . का उपयोग कर सकते हैं id = 1 . के हमारे मौजूदा रिकॉर्ड को स्वैप करने के लिए के खोए हुए समय की खोज में मार्सेल प्राउस्ट द्वारा हरे अंडे और हैम के साथ डॉ. सीस द्वारा:

mysql> REPLACE INTO books
    (id, title, author, year_published)
VALUES
    (1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 2 rows affected (0.00 sec)

ध्यान दें कि भले ही हमने केवल एक पंक्ति को बदल दिया हो, परिणाम यह दर्शाता है कि दो पंक्तियाँ प्रभावित हुईं क्योंकि हम वास्तव में DELETED मौजूदा पंक्ति तब INSERTED इसे बदलने के लिए नई पंक्ति।

REPLACE . का उपयोग करने के बारे में अधिक जानकारी आधिकारिक दस्तावेज़ीकरण में पाया जा सकता है।

INSERT ... ON DUPLICATE KEY UPDATE का उपयोग करना

INSERTING . के लिए वैकल्पिक (और आम तौर पर पसंदीदा) विधि पंक्तियों में जिसमें डुप्लिकेट हो सकते हैं UNIQUE या PRIMARY KEY मानों का उपयोग INSERT ... ON DUPLICATE KEY UPDATE . का उपयोग करना है कथन और खंड।

REPLACE के विपरीत - DELETE . के कारण एक स्वाभाविक रूप से विनाशकारी आदेश आवश्यक होने पर यह कमांड निष्पादित करता है - INSERT ... ON DUPLICATE KEY UPDATE का उपयोग करके गैर-विनाशकारी है , इसमें यह केवल INSERT . जारी करेगा या UPDATE कथन, लेकिन कभी नहीं DELETE

उदाहरण के लिए, हमने तय किया है कि हम अपने id = 1 . को बदलना चाहते हैं हरे अंडे और हैम . का रिकॉर्ड और इसे वापस मूल खोया समय की खोज में . पर वापस लाएं इसके बजाय रिकॉर्ड करें। इसलिए हम अपना मूल INSERT ले सकते हैं विवरण और नया जोड़ें ON DUPLICATE KEY UPDATE खंड:

mysql> SET @id = 1,
    @title = 'In Search of Lost Time',
    @author = 'Marcel Proust',
    @year_published = 1913;
INSERT INTO books
    (id, title, author, year_published)
VALUES
    (@id, @title, @author, @year_published)
ON DUPLICATE KEY UPDATE
    title = @title,
    author = @author,
    year_published = @year_published;

ध्यान दें कि हम सामान्य UPDATE का उपयोग कर रहे हैं सिंटैक्स (लेकिन अनावश्यक table . को छोड़कर नाम और SET कीवर्ड), और केवल non-UNIQUE . असाइन करना मूल्य। साथ ही, ON DUPLICATE KEY UPDATE . के लिए अनावश्यक होते हुए भी ठीक से काम करने के लिए, हमने user variables . का उपयोग करने का भी विकल्प चुना है इसलिए हमें उन वास्तविक मानों को निर्दिष्ट करने की आवश्यकता नहीं है जिन्हें हम INSERT . करना चाहते हैं या UPDATE एक से अधिक बार।

परिणामस्वरूप, हमारा id = 1 रिकॉर्ड ठीक से था UPDATED उम्मीद के मुताबिक:

mysql> SELECT * FROM books LIMIT 1;
+----+------------------------+---------------+----------------+
| id | title                  | author        | year_published |
+----+------------------------+---------------+----------------+
|  1 | In Search of Lost Time | Marcel Proust |           1913 |
+----+------------------------+---------------+----------------+
1 row in set (0.00 sec)

अधिक जानकारी आधिकारिक दस्तावेज़ीकरण में पाई जा सकती है।


  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. MySQLSyntaxErrorException निकट है? रेडीस्टेडमेंट निष्पादित करने का प्रयास करते समय

  4. MySQL और NoSQL:सही चुनने में मेरी मदद करें

  5. MySQL में प्राथमिक कुंजी निकालें