2012-01-24 5 views
19

insert... on duplicate key update का उपयोग करते समय, एकाधिक कॉलम अपडेट करने के लिए वाक्यविन्यास क्या है?डुप्लिकेट कुंजी अपडेट पर - एकाधिक कॉलम

INSERT INTO table1 (col1, col2, col3, col4) VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’) 
ON DUPLICATE KEY UPDATE col2=‘$val2’, col3=‘$val3’, col4=‘$val4’ // <-- not sure 

अद्यतन: मैं इसे PHP के भीतर उपयोग कर रहा हूं। चूंकि यह एक वाक्यविन्यास प्रश्न है, यह बहुत प्रासंगिक है।

$result = mysql_query("INSERT INTO table1 (col1, col2, col3, col4) 
         VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’) 
         ON DUPLICATE KEY UPDATE (col2=‘$val2’, col3=‘$val3’, col4=‘$val4’)") 

फिर से, के साथ "अपडेट" इस अंतिम भाग बारे में निश्चित नहीं।

उत्तर

0

आपकी क्वेरी सही लगती है।

INSERT INTO Stat (id, month, year, views, redirects, onList, onMap, emails) VALUE ("' . $Id . '","' . $month . '","' . $year . '",0,0,"' . $data['onList'] . '","' . $data['onMap'] . '",0) ON DUPLICATE KEY UPDATE onList=onList+' . $data['onList'] . ', onMap=onMap+' . $data['onMap'] 
+0

क्यों दूसरा '' में onList = onList + आवश्यक onList' है '। $ डेटा [' onList '] '।? क्या यह 'ऑनलिस्ट = $ डेटा [' ऑनलिस्ट '] 'पर्याप्त नहीं है? या मेरे उदाहरण में: 'col2 =' $ val2''? –

+0

वह जो कर रहा है वह थोड़ा अलग है, वह ऑनलाइन फ़ील्ड मान पर $ डेटा ['ऑनलिस्ट'] जोड़ रहा है। – sathia

29
INSERT INTO table1 
    (`col1`, `col2`, `col3`, `col4`) 
VALUES 
    ('val1', 'val2', 'val3', 'val4') 
ON DUPLICATE KEY UPDATE 
    `col2`='val2', 
    `col3`='val3', [...] 

मैं अपने उद्धरण और tickmarks तय: क्वेरी का इस प्रकार के मेरे उदाहरण है।

संपादित करें:

PHP में:

$result = mysql_query(" 
    INSERT INTO table1 
     (col1, col2, col3, col4) 
    VALUES 
     ('" . $val1 . "', '" . $val2 . "', '" . $val3 . "', '" . $val4 . "') 
    ON DUPLICATE KEY UPDATE 
     col2='" . $val2 . "', 
     col3='" . $val3 . "', 
     col4='" . $val4 . "'" 
); 

नोट करें कि मान एकल उद्धरण चिह्न ' से घिरे हैं। यदि मान एक संख्या प्रकार (आईएनटी, फ्लोट, आदि) हैं तो आप उन उद्धरण चिह्नों को छोड़ सकते हैं। जब तक आप count, type, या table जैसे कॉलम नामों का उपयोग नहीं कर रहे हैं, तब तक बैकटिक्स कॉलम नामों के आस-पास वैकल्पिक हैं।

PHP उदाहरण में, तारों को स्पष्ट रूप से अलग करने के लिए स्ट्रिंग कॉन्सटेनेशन का उपयोग किया जाता है।

+0

मेरा अपडेट देखें, यह php स्क्रिप्ट के भीतर है, इसलिए वाक्यविन्यास। यदि आप अभी एक नज़र डाल सकते हैं तो मैं इसकी सराहना करता हूं। धन्यवाद –

+0

आप मूल्यों के लिए टिकटें का उपयोग नहीं कर सकते हैं, जिनका उपयोग कॉलम नामों के साथ किया जाना है। मैंने अपने उत्तर पर दिखाए गए वाक्यविन्यास का उपयोग करें। यह काम करेगा। – sathia

+0

$ परिणाम = mysql_query ("तालिका 1 में प्रवेश करें ('col1', 'col2', 'col3', 'col4') VALUES ("। $ Val1। "," $ Val2। "," $ Val3। ", "$ val4।") डिप्लिकेट कुंजी अपडेट 'col2' = "। $ val2।", 'col3' = "। val3।", 'col4' = "। $ val4।") – sathia

0

स्पष्ट वाक्यविन्यास के लिए एक और वाक्यविन्यास रूप है;

INSERT INTO `table1` SET `id`=$id, 
         `col2`='$col2', 
         `col3`='$col3'[, ...] 
ON DUPLICATE KEY UPDATE `col2`='$col2', 
         `col4`='$col4'[, ...] 

उदाहरण;

INSERT INTO customers SET cid=10, 
          createdon=NOW(), 
          createdby='user', 
          cname='Steve' 
    ON DUPLICATE KEY UPDATE modifiedon=NOW(), 
          modifiedby='user', 
          cname='Steve'; 

अगर वहाँ आईडी के साथ एक ग्राहक = मौजूद नहीं है डेटाबेस यह बनाया जाएगा और स्तंभों सीआईडी, createdon, createdby, CNAME की स्थापना की जाएगी में 10। यदि यह अस्तित्व में है, तो इसे अपडेट किया जाएगा और कॉलम संशोधित, संशोधित, cname अपडेट किया जाएगा।

नोट # 1: यदि आप प्राथमिक कुंजी cid = 0 के लिए यहां डालते हैं, तो यह ऑटोऑक्रिकमेंट (निश्चित रूप से, यदि पीके कॉलम को ऑटोऑक्रिकमेंट के रूप में परिभाषित किया गया है) को आग लग जाएगी और एक रिकॉर्ड डाला जाएगा!

नोट # 2: डिप्लिकेट कुंजी अपडेट मौजूदा पीके आईडी रिकॉर्ड के लिए अद्यतन बनाता है। लेकिन अगर यह किसी भी अद्वितीय कुंजी कॉलम पर डिप्लिकेट किया जाता है तो यह भी अपडेट करता है। उदाहरण के लिए, यदि आपने परिभाषित किया है कि cname कॉलम अद्वितीय है, तो पहले से मौजूद cname = 'स्टीव' के साथ रिकॉर्ड सहेजने के परिणामस्वरूप उस रिकॉर्ड का अद्यतन होगा (नया INSERT नहीं)। इसके बारे में परवाह करें क्योंकि आप उम्मीद कर सकते हैं कि डीबी अद्वितीय कुंजी बाधा उल्लंघन के लिए त्रुटि देता है जो यहां नहीं होगा।

14

अच्छा, यह पुराना है।

INSERT INTO table1 
    (col1, col2, col3, col4) 
VALUES 
    ('val1', 'val2', 'val3', 'val4') 
ON DUPLICATE KEY UPDATE 
    col2=VALUES(col2) 
    col3=VALUES(col3) [,...] 

के रूप में है कौन सा: लेकिन निश्चित रूप से आप केवल एक मूल्य एक बार , वहाँ यह (जो अनेक निवेशन, या तैयार बयानों के लिए काम में आता) क्वेरी में दूसरी बार जोड़ने के लिए कोई कारण नहीं है प्रदान करने की आवश्यकता लाभ यह अभी भी एक बहु डालने बयान के लिए काम करेंगे:

INSERT INTO table1 
    (col1, col2, col3, col4) 
VALUES 
    ('val1', 'val2', 'val3', 'val4'), 
    ('val5', 'val6', 'val7', 'val8'), 
    ('val9', 'val10', 'val11', 'val12') 
ON DUPLICATE KEY UPDATE 
    col2=VALUES(col2) 
    col3=VALUES(col3) [,...] 
+0

का उपयोग करने के बारे में यह सबसे अच्छा जवाब है, बस मेरा उपयोग करें एसक्यूएल की कार्यक्षमता जो एकाधिक आवेषण का समर्थन करती है –