2010-07-05 21 views
7

क्या निम्न क्वेरी करने के लिए सबसे कारगर तरीका प्रदर्शन पर लोगों के विचार कर रहे हैं: यदि col_1 और col_2 मानों के संयोजन पहले से ही मौजूदएक अद्वितीय कॉलम के बिना MySQL 'डिप्लिकेट कुंजी पर अद्यतन'?

  • 3 स्तंभ तालिका

  • UPDATE col_3

  • अन्य INSERT नई पंक्ति

मुझे लगता है कि मुझे डिप्लिकेट कुंजी (जिसे मैंने पहले कभी नहीं उपयोग किया है) पर अपडेट करने पर मुझे कुछ प्रकार की ज़रूरत है, हालांकि मेरे पास 'कुंजी' नहीं है बल्कि इसके बजाय एक कुंजी बनाने के लिए दो मानों (कॉलम) की एक जोड़ी है ...

उत्तर

15

आप MySQL में एकाधिक कॉलम (एक समग्र कुंजी कहा जाता है) से कुंजी बना सकते हैं, जो ON DUPLICATE KEY को ठीक काम करने की अनुमति देगा।

// create a composite index 
CREATE INDEX my_composite_index ON my_table (column1, column2); 

// insert or update 
INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2') ON DUPLICATE KEY UPDATE column3=column3+1; 
+0

धन्यवाद ceejayoz, क्या आप मुझे ऑन डिप्लिकेट कुंजी के लिए कुछ नमूना कोड देने में सक्षम हैं? – Haroldo

+0

@ हारोल्डो हो गया, संपादित करें देखें। – ceejayoz

+0

भयानक, वास्तव में आप - बहुत बहुत धन्यवाद! मुझे जल्दी से जांच करनी चाहिए - मुझे केवल एक बार इंडेक्स बनाने की जरूरत है? – Haroldo

1

सबसे प्रभावी तरीका अद्वितीय कुंजी बनाने और डिप्लीकेट कुंजी अपडेट पर उपयोग करना है।

धीमी तरीका है करने के लिए:
लॉक टेबल
तालिका के (आप सर्वश्रेष्ठ प्रदर्शन के लिए वैसे भी एक सूचकांक की जरूरत है)
अगर मौजूद है, अद्यतन और को
INSERT
अनलॉक तालिकाएं

-1

संपादित करें: पर ध्यान न दें मेरे सुझाव

आप एक समग्र कुंजी का उपयोग कर सकते हैं क्योंकि सिजोज ने कहा था, हालांकि मुझे लगता है कि आपको डीयू पर अद्यतन करने की बजाय प्रतिलिपि की आवश्यकता है प्लिकेट कुंजी क्योंकि यदि कोई डुप्लिकेट नहीं मिलता है तो रीप्लेस भी सम्मिलित करता है।

नोट: मुझे डिप्लिकेट कुंजी पर अद्यतन की कार्यप्रणाली नहीं पता है, लेकिन ऐसा लगता है जैसे यह आवेषण नहीं करता है।

+3

'ऑन डिप्लिकेट कुंजी अपडेट' वास्तव में केवल 'INSERT' प्रश्नों के लिए है। http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html 'स्थानांतरित करें' एक खराब विकल्प है क्योंकि यह आपको केवल एक फ़ील्ड या दो अपडेट करने की अनुमति नहीं देता है - आपके पास है पूरी पंक्ति के लिए मान निर्दिष्ट करने के लिए। – ceejayoz

+0

मेरा बुरा, टिप्पणी के लिए धन्यवाद –

संबंधित मुद्दे