मेरे 2INSERT ... पर DUPLICATE KEY UPDATE` में 2 पंक्तियाँ क्यों प्रभावित होती हैं?


91

मैं निम्नलिखित तालिका में एक के INSERT ... ON DUPLICATE KEY UPDATEलिए कर रहा हूँ PRIMARY KEY:

DESCRIBE users_interests;
+------------+---------------------------------+------+-----+---------+-------+
| Field      | Type                            | Null | Key | Default | Extra |
+------------+---------------------------------+------+-----+---------+-------+
| uid        | int(11)                         | NO   | PRI | NULL    |       |
| iid        | int(11)                         | NO   | PRI | NULL    |       |
| preference | enum('like','dislike','ignore') | YES  |     | NULL    |       |
+------------+---------------------------------+------+-----+---------+-------+

हालाँकि, भले ही ये मूल्य अद्वितीय हों, मैं 2 पंक्तियों को प्रभावित देख रहा हूँ।

INSERT INTO users_interests (uid, iid, preference) VALUES (2, 2, 'like')
ON DUPLICATE KEY UPDATE preference='like';
Query OK, 2 rows affected (0.04 sec)

ये क्यों हो रहा है?

संपादित करें

तुलना के लिए, यह क्वेरी देखें:

UPDATE users_interests SET preference='like' WHERE uid=2 AND iid=2;
Query OK, 1 row affected (0.44 sec)
Rows matched: 1  Changed: 1  Warnings: 0

आपके पास पहली जगह में दो प्राथमिक कुंजी क्यों हैं?
पकाका

1
@Pekka, PRIMARY KEYएक एकल pk है जिस पर (uid, iid)अधिकांश क्वेरीज़ तब चलेंगी जब दोनों मान ज्ञात हों।
जोश स्मिथ

1
@ जोश मैं देखता हूँ। मैनुअल हालांकि यह हतोत्साहित करने के लिए लगता है: In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.क्या यह एक प्राथमिक कुंजी करने की आवश्यकता है? सामान्य सूचकांक क्यों नहीं?
पक्के

@Pekka, ईमानदारी से यकीन नहीं होता। मैं अभी भी इसके लिए अपेक्षाकृत नया हूं। क्या इस मामले में सूचकांक अधिक मायने रखता है?
जोश स्मिथ

3
@ जोश, दोनों स्तंभों को फैलाते हुए एक सामान्य सूचकांक यहाँ ठीक काम करेगा
पक्के

जवाबों:


201

से मैनुअल :

DUPLICATE KEY UPDATE पर, प्रति पंक्ति प्रभावित प्रभावित-पंक्ति मान 1 है यदि पंक्ति को नई पंक्ति के रूप में सम्मिलित किया जाता है और यदि मौजूदा पंक्ति अद्यतन की जाती है तो 2।


15
और अगर एक मौजूदा पंक्ति अपने मौजूदा मूल्यों पर सेट है।
शविश

1
@ सविश, धन्यवाद! यह वास्तव में मददगार है।
ग्रीन

2
मुझे आश्चर्य है कि इसके पीछे तर्क क्या होगा .. स्पष्ट रूप से, इसे कम भ्रमित करने के लिए प्रभावित पंक्तियों की संख्या के बजाय प्रतिक्रिया कोड के रूप में वापस किया जा सकता था
सुदीप भंडारी

...: | क्या प्रभावित पंक्तियों की वास्तविक संख्या निर्धारित करने का कोई तरीका है ? यहां तक ​​कि अगर एक मौजूदा पंक्ति को अद्यतन किया जाता है, तब भी केवल एक ही पंक्ति प्रभावित होती है
उलद कासच

क्या यह बैच आवेषण के लिए भी समान है? … VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
भाग्योदयकाल

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