18 अक्टूबर 2007
शुरू करने के लिए: नवीनतम MySQL के रूप में, शीर्षक में प्रस्तुत सिंटैक्स संभव नहीं है। लेकिन मौजूदा कार्यक्षमता का उपयोग करके जो अपेक्षित है उसे पूरा करने के कई बहुत आसान तरीके हैं।
3 संभावित समाधान हैं: INSERT IGNORE, REPLACE, या INSERT ... का उपयोग करके DUPLICATE कुंजी का उपयोग करें।
कल्पना कीजिए कि हमारे पास एक मेज है:
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_transcript_id' डेटाबेस में पहले से मौजूद है, तो इसे चुपचाप छोड़ दिया जाएगा (अनदेखा कर दिया जाएगा)। (अधिक सटीक होने के लिए, यहां MySQL संदर्भ मैनुअल का एक उद्धरण है: “यदि आप IGNORE कीवर्ड का उपयोग करते हैं, तो INSERT स्टेटमेंट को निष्पादित करते समय होने वाली त्रुटियों को चेतावनी के रूप में माना जाता है। उदाहरण के लिए, IGNORE के बिना, एक पंक्ति जो एक मौजूदा UNIQUE इंडेक्स को डुप्लिकेट करती है। या तालिका में प्राथमिक कुंजी मान डुप्लिकेट-कुंजी त्रुटि का कारण बनता है और कथन निरस्त कर दिया जाता है। ") यदि रिकॉर्ड अभी तक मौजूद नहीं है, तो इसे बनाया जाएगा।
इस दूसरी विधि में कई संभावित कमजोरियां हैं, जिसमें किसी अन्य समस्या के होने पर (मैनुअल देखें) क्वेरी का गैर-गर्भपात भी शामिल है। इस प्रकार इसका उपयोग किया जाना चाहिए यदि पहले बिना IGNORE कीवर्ड के परीक्षण किया गया हो।
विधि 3: INSERT का उपयोग कर… DUPLICATE KEY पर अद्यतन करें:
तीसरा विकल्प INSERT … ON DUPLICATE KEY UPDATE
सिंटैक्स का उपयोग करना है, और UPDATE भाग में बस कुछ अर्थहीन (खाली) ऑपरेशन नहीं करना है, जैसे 0 + 0 की गणना करना (ज्योफ्रे सुझाव देता है कि इस ऑपरेशन को अनदेखा करने के लिए MySQL ऑप्टिमाइज़ेशन इंजन के लिए id = id असाइनमेंट कर रहा है)। इस पद्धति का लाभ यह है कि यह केवल डुप्लिकेट प्रमुख घटनाओं को अनदेखा करता है, और अभी भी अन्य त्रुटियों पर गर्भपात करता है।
अंतिम सूचना के रूप में: यह पोस्ट Xaprb से प्रेरित थी। मैं लचीली एसक्यूएल क्वेरी लिखने पर उनके अन्य पोस्ट से परामर्श करने की सलाह दूंगा।