2013-05-04 10 views
16

MySQL 4.1.0 के बाद से के लिए कुंजी अद्यतन डुप्लीकेट, यह ON DUPLICATE KEY UPDATE बयान व्यवहार निर्दिष्ट करने को जोड़ने के लिए जब मूल्यों डाला (INSERT या SET या VALUES के साथ) गंतव्य तालिका w.r.t. में पहले से ही संभव है PRIMARY KEY या कुछ UNIQUE फ़ील्ड। यदि PRIMARY KEY या कुछ UNIQUE फ़ील्ड के लिए मान पहले से ही तालिका में है, INSERT को UPDATE द्वारा प्रतिस्थापित किया गया है।MySQL व्यवहार कई अद्वितीय क्षेत्रों

  • कैसे मामले में ON DUPLICATE KEY UPDATE व्यवहार मेरे तालिका में कई UNIQUE क्षेत्र हैं करता है?

  • क्या मेरे पास केवल एक अपडेट हो सकता है, अगर UNIQUE फ़ील्ड मिलान किया गया है?

  • क्या मेरे पास केवल एक अपडेट हो सकता है यदि UNIQUE फ़ील्ड दोनों एक साथ मेल खाते हैं?

उत्तर

20

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    -> ON DUPLICATE KEY UPDATE c=c+1; 

पर विचार करता है, तो ए और बी UNIQUE क्षेत्र हैं, UPDATEa = 1 OR b = 2 पर होता है। साथ ही जब स्थिति a = 1 OR b = 2 दो या दो से अधिक प्रविष्टियों से मिलती है, तो अपडेट केवल एक बार किया जाता है।

पूर्व यहां ईद और नाम UNIQUE क्षेत्रों के साथ तालिका तालिका

Id  Name  Value 
1  P  2 
2  C  3 
3  D  29 
4  A  6 

तो क्वेरी

INSERT INTO table (Id, Name, Value) 
VALUES (1, C, 7) 

है तो हम

Id  Name  Value 
1  P  2 
2  C  3 
3  D  29 
4  A  6 
1  C  7 

जो ईद और नाम की विशिष्टता का उल्लंघन करता हो। अब

INSERT INTO table (Id, Name, Value) 
VALUES (1, C, 7) 
ON DUPLICATE KEY UPDATE Value = 7 

साथ हम कई कुंजी पर

Id  Name  Value 
1  P  7 
2  C  7 
3  D  29 
4  A  6 

व्यवहार मिलता है निम्नलिखित

ON DUPLICATE KEY UPDATE में UPDATE अगर UNIQUE क्षेत्र में से एक मूल्य सम्मिलित करने के लिए किया जाता है के बराबर होती है है। यहां, UPDATEId = 1 OR Name = C पर किया गया है।यह

UPDATE table 
SET Value = 7 
WHERE Id = 1 OR Name = C 

के बराबर है क्या होगा यदि मैं एक अद्यतन केवल चाहते हैं, के लिए या तो कुंजी

LIMIT कीवर्ड के साथ UPDATE बयान का उपयोग कर सकते

UPDATE table 
SET Value = 7 
WHERE Id = 1 OR Name = C 
LIMIT 1; 

Id  Name  Value 
1  P  7 
2  C  3 
3  D  29 
4  A  6 
दे देंगे जो

क्या होगा यदि मैं एक अद्यतन केवल तभी दोनों कुंजी के लिए मान मिलान किया जाता है

एक समाधान चाहते ALTER TABLE है और बनाने के PRIMARY KEY (या विशिष्टता) दोनों क्षेत्रों पर काम करते हैं।

ALTER TABLE table 
DROP PRIMARY KEY 
ADD PRIMARY KEY (Id, Name); 

अब,

INSERT INTO table (Id, Name, Value) 
VALUES (1, C, 7) 
ON DUPLICATE KEY UPDATE Value = 7 

पर हम कोई डुप्लिकेट (दोनों कुंजी पर) पाया जाता है के बाद से

Id  Name  Value 
1  P  2 
2  C  3 
3  D  29 
4  A  6 
1  C  7 

मिलता है।

+1

देखें आप प्राथमिक कुंजी के रूप में दो कॉलम के साथ एक मेज है, और पर नकली चाबी के साथ काम, पी कॉलम के लिए अद्वितीय सूचकांक जोड़ने से बचना चाहिए चाहते हैं, क्योंकि यह करता है, तो अद्यतन करेगा मूल्यों में पीके 1 या पीके 2 मौजूद हैं। – jloria

+2

क्या दूसरे कॉलम पर अनन्य बाधा होने का कोई तरीका है, लेकिन ऐसा है कि यह इस डुप्लिकेट कुंजी अपडेट ऑपरेशन को प्रभावित नहीं करता है? इसका मतलब यह है कि यदि अद्वितीय बाधा पूरी नहीं होती है तो सम्मिलित या अद्यतन विफल हो जाता है। – CMCDragonkai

0
  1. कैसे MySQL व्यवहार करते है ... यह व्यवहार की उम्मीद के रूप में, वह यह है कि नकली चाबी खंड पर निष्पादित करता है।

  2. क्या मेरे पास या तो एक अपडेट हो सकता है ... असल में, आपके पास केवल एक ही डिलीवरी कुंजी क्लॉज है, इसलिए आपको कुछ बाधाओं को अलग करने के लिए कुछ कोड डालना होगा। सौभाग्य से, यह संभव है। केवल एक चीज जो आपको जाननी चाहिए, असाइनमेंट मामलों का क्रम, और आप कई बार असाइन कर सकते हैं। मान लीजिए, आपके पास ए और बी पर अनूठी बाधा है, और आप केवल सी को अपडेट करना चाहते हैं यदि एक विशिष्टता शामिल है: ... कुंजी अपडेट सी = आईएफ (ए = वैल्यूज (ए) और बी <> मूल्य (बी), VALUES (सी), सी), बी = VALUES (बी)

    लेकिन यदि आप असाइनमेंट के क्रम को बदलते हैं तो दूसरी स्थिति में हमेशा गलत होगा।

  3. 2.

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