INSERT IGNORE INTO table
. का उपयोग करें ।
इसमें INSERT … ON DUPLICATE KEY UPDATE
भी है सिंटैक्स, और आप में स्पष्टीकरण पा सकते हैं। 13.2.6.2 सम्मिलित करें ... डुप्लीकेट कुंजी अद्यतन विवरण पर
।
पोस्ट से bogdan.org.ua Google का वेब कैश :
<ब्लॉकक्वॉट>18 अक्टूबर 2007
शुरू करने के लिए:नवीनतम MySQL के रूप में, शीर्षक में प्रस्तुत वाक्य रचना संभव नहीं है। लेकिन मौजूदा कार्यक्षमता का उपयोग करके जो अपेक्षित है उसे पूरा करने के कई आसान तरीके हैं।
3 संभावित समाधान हैं:डुप्लीकेट कुंजी अद्यतन पर INSERT IGNORE, REPLACE, या INSERT… का उपयोग करना।
कल्पना कीजिए कि हमारे पास एक टेबल है:
CREATE TABLE `transcripts` (
`ensembl_transcript_id` varchar(20) NOT NULL,
`transcript_chrom_start` int(10) unsigned NOT NULL,
`transcript_chrom_end` int(10) unsigned NOT NULL,
PRIMARY KEY (`ensembl_transcript_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
अब कल्पना करें कि हमारे पास एन्सेम्बल से ट्रांसक्रिप्ट्समेटा-डेटा आयात करने वाली एक स्वचालित पाइपलाइन है, और विभिन्न कारणों से निष्पादन के किसी भी चरण में पाइपलाइन टूट सकती है। इस प्रकार, हमें दो चीजें सुनिश्चित करने की आवश्यकता है:
<ब्लॉकक्वॉट>- पाइपलाइन का बार-बार निष्पादन हमारे> डेटाबेस को नष्ट नहीं करेगा
- 'डुप्लिकेट> प्राथमिक कुंजी' त्रुटियों के कारण बार-बार निष्पादन नहीं मरेंगे।
विधि 1:REPLACE का उपयोग करना
यह बहुत आसान है:
REPLACE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
यदि रिकॉर्ड मौजूद है, तो इसे अधिलेखित कर दिया जाएगा; अगर यह अभी तक मौजूद नहीं है, तो इसे बनाया जाएगा। हालांकि, इस पद्धति का उपयोग करना हमारे मामले के लिए प्रभावी नहीं है:हमें मौजूदा रिकॉर्ड को अधिलेखित करने की आवश्यकता नहीं है, उन्हें छोड़ना ठीक है।
विधि 2:INSERT IGNORE का उपयोग करना भी बहुत आसान है:
INSERT IGNORE INTO `transcripts`
SET `ensembl_transcript_id` = 'ENSORGT00000000001',
`transcript_chrom_start` = 12345,
`transcript_chrom_end` = 12678;
यहां, यदि 'ensembl_transscript_id' डेटाबेस में पहले से मौजूद है, तो इसे चुपचाप छोड़ दिया जाएगा (अनदेखा)। (अधिक सटीक होने के लिए, यहां MySQL संदर्भ मैनुअल से उद्धरण दिया गया है:"यदि आप इग्नोर कीवर्ड का उपयोग करते हैं, तो INSERT कथन को निष्पादित करते समय होने वाली त्रुटियों को इसके बजाय चेतावनियों के रूप में माना जाता है। उदाहरण के लिए, इग्नोर के बिना, एक पंक्ति जो मौजूदा अद्वितीय अनुक्रमणिका या प्राथमिक कुंजी को डुप्लिकेट करती है तालिका में मान डुप्लिकेट-कुंजी त्रुटि का कारण बनता है और कथन निरस्त कर दिया जाता है।) यदि रिकॉर्ड अभी तक मौजूद नहीं है, तो इसे बनाया जाएगा।
इस दूसरी विधि में कई संभावित कमजोरियां हैं, जिसमें कोई अन्य समस्या होने पर प्रश्न का गर्भपात न करना (मैनुअल देखें) शामिल है। इस प्रकार इसका उपयोग किया जाना चाहिए यदि पहले इग्नोर कीवर्ड के बिना परीक्षण किया गया हो।
विधि 3:डुप्लीकेट कुंजी अद्यतन पर INSERT… का उपयोग करके:
तीसरा विकल्प है INSERT … ON DUPLICATE KEY UPDATE
. का उपयोग करना वाक्यविन्यास, और अद्यतन भाग में कुछ भी व्यर्थ (खाली) ऑपरेशन नहीं करते हैं, जैसे 0 + 0 की गणना करना (जियोफ्रे इस ऑपरेशन को अनदेखा करने के लिए MySQL ऑप्टिमाइज़ेशन इंजन के लिए theid=id असाइनमेंट करने का सुझाव देता है)। इस पद्धति का लाभ यह है कि यह केवल डुप्लीकेट-कुंजी घटनाओं पर ध्यान नहीं देती है, और फिर भी अन्य त्रुटियों पर रोक लगाती है।
अंतिम सूचना के रूप में:यह पोस्ट Xaprb से प्रेरित थी। मैं लचीली SQL क्वेरी लिखने पर उनकी अन्य पोस्ट से परामर्श करने की भी सलाह दूंगा।