INSERT ... DUPLICATE KEY पर (कुछ न करें)


184

मेरे पास दो स्तंभों के लिए एक अद्वितीय कुंजी वाली एक तालिका है:

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

मैं उस तालिका में एक पंक्ति सम्मिलित करना चाहता हूं, लेकिन यदि कुंजी मौजूद है, तो कुछ भी नहीं करने के लिए! मैं नहीं चाहता कि कोई त्रुटि उत्पन्न हो क्योंकि चाबियाँ मौजूद हैं।

मुझे पता है कि निम्नलिखित सिंटैक्स है:

INSERT ... ON DUPLICATE KEY UPDATE ...

लेकिन क्या कुछ ऐसा है:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

जवाबों:


331

हां, उपयोग करें INSERT ... ON DUPLICATE KEY UPDATE id=id(यह पंक्ति अद्यतन को ट्रिगर नहीं करेगा भले ही idखुद को सौंपा गया हो)।

यदि आप त्रुटियों (रूपांतरण त्रुटियां, विदेशी कुंजी त्रुटियां) और स्वत: अंकन क्षेत्र की थकावट के बारे में परवाह नहीं करते हैं (यह डुप्लिकेट कुंजी के कारण पंक्ति सम्मिलित नहीं होने पर भी बढ़ा हुआ है), तो उपयोग करें INSERT IGNORE


5
बस INNERT के बाद IGNORE जोड़ने के लिए, सिंटैक्स के बाकी समान है?
ufk

25
@ufk: भाग के INSERT IGNOREबिना ON DUPLICATE KEY, जैसेINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
बोल्ट

125
ध्यान दें कि INSERT IGNORE अन्य त्रुटियों जैसे डेटा रूपांतरण विफलताओं को भी अनदेखा करता है।
mjcopple

36
इसलिए मैं DUPLICATE KEY UPDATE id = id का उपयोग करूंगा। मैं केवल कुंजी डुप्लिकेट को अनदेखा करना चाहता हूं किसी अन्य प्रकार की त्रुटि नहीं।
ufk

7
सावधान रहें
IGNORE

9

'अस्तित्व में नहीं है' तो इंप्लिमेंट कैसे डालें?

1। REPLACE INTO

पेशेवरों:

  1. सरल।

विपक्ष:

  1. बहुत धीमा।

  2. ऑटो वेतन वृद्धि कुंजी होगा बदल (1 से वृद्धि) अगर वहाँ प्रवेश मैचों है unique keyया primary keyहै, क्योंकि यह नया सम्मिलित करें तो पुराने प्रविष्टि को हटाता है।

2। INSERT IGNORE

पेशेवरों:

  1. सरल।

विपक्ष:

  1. ऑटो-इंक्रीमेंट कुंजी नहीं बदलेगी अगर एंट्री मैच हो unique keyया primary keyफिर ऑटो-इन्क्रीमेंट इंडेक्स 1 से बढ़ जाए

  2. कुछ अन्य त्रुटियों / चेतावनियों को अनदेखा किया जाएगा जैसे कि डेटा रूपांतरण त्रुटि।

3। INSERT ... ON DUPLICATE KEY UPDATE

पेशेवरों:

  1. आप इसके साथ 'सेव या अपडेट' फ़ंक्शन को आसानी से लागू कर सकते हैं

विपक्ष:

  1. यदि आप केवल अपडेट नहीं डालना चाहते हैं तो अपेक्षाकृत जटिल दिखता है।

  2. ऑटो-इंक्रीमेंट कुंजी नहीं बदलेगी अगर एंट्री मैच हो unique keyया primary keyफिर ऑटो-इन्क्रीमेंट इंडेक्स 1 से बढ़ जाए

4. बंद स्वत: वेतन वृद्धि कुंजी करने के लिए किसी भी तरह से बढ़ रही है, तो प्रवेश मैचों है वहाँ unique keyया primary key?

जैसा कि @toien द्वारा नीचे टिप्पणी में उल्लेख किया गया है: "ऑटो-इन्क्रीमेंट कॉलम प्रभावी होगा। innodb_autoinc_lock_modeसंस्करण 5.1 के बाद कॉन्फ़िगरेशन पर निर्भर करता है " यदि आप innodbअपने इंजन के रूप में उपयोग कर रहे हैं , लेकिन यह भी संगामिति को प्रभावित करता है, इसलिए इसका उपयोग करने से पहले अच्छी तरह से विचार करने की आवश्यकता है। अभी तक मुझे कोई बेहतर उपाय दिखाई नहीं दे रहा है।


ऑटो वेतन वृद्धि स्तंभ प्रभावित होगा पर निर्भर करता है innodb_autoinc_lock_modeसंस्करण 5.1 के बाद config
toien

1

उपयोग ON DUPLICATE KEY UPDATE ...,
नकारात्मक: क्योंकि UPDATEदूसरी क्रिया के लिए संसाधनों का उपयोग करता है।

उपयोग INSERT IGNORE ...,
नकारात्मक: MySQL कोई त्रुटि नहीं दिखाएगा यदि कुछ गलत हो जाता है, तो आप त्रुटियों को संभाल नहीं सकते हैं। यदि आप क्वेरी के बारे में परवाह नहीं करते हैं तो इसका उपयोग करें।


@abdul क्या आप यहां बताए गए मायस्कल सपोर्ट हैं?
ललित तारसरिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.