2013-05-13 4 views
36

कैसंड्रा के खिलाफ सीक्यूएल निष्पादित करते समय UPDATE और INSERT के बीच क्या अंतर है?कैसंद्रा में अद्यतन और INSERT के बीच अंतर?

ऐसा लगता है कि कोई अंतर नहीं होता था, लेकिन अब documentation कहता है कि INSERT काउंटर का समर्थन नहीं करता है जबकि UPDATE करता है।

क्या उपयोग करने के लिए "पसंदीदा" विधि है? या ऐसे मामले हैं जहां एक दूसरे पर इस्तेमाल किया जाना चाहिए?

बहुत बहुत धन्यवाद!

+0

'INSERT' बनाम' UPDATE' के बीच कोई प्रदर्शन अंतर है? – Pankaj

+0

@ पंकज मैं भी यह जानना चाहता हूं। क्या आप इसके बारे में कोई जानकारी जानते हैं? – niaomingjian

+0

क्षमा करें @niaomingjian मुझे इस पर कोई और जानकारी नहीं मिली। – Pankaj

उत्तर

17

कैसंड्रा में काउंटर कॉलम मनमाने ढंग से मूल्य पर सेट नहीं किए जा सकते थे: उन्हें केवल किसी भी मनमाना मूल्य से बढ़ाया या घटाया जा सकता है।

इस कारण से, INSERT काउंटर कॉलम का समर्थन नहीं करता है क्योंकि आप काउंटर कॉलम में कोई मान "सम्मिलित नहीं" कर सकते हैं। आप कुछ मूल्य से केवल UPDATE उन्हें (वृद्धि या कमी) कर सकते हैं। यहां बताया गया है कि आप काउंटर कॉलम को कैसे अपडेट करेंगे।

UPDATE ... SET name1 = name1 + <value> 

आप से पूछा:

वहाँ एक "पसंदीदा" का उपयोग करने के विधि है? या ऐसे मामले हैं जहां एक दूसरे पर इस्तेमाल किया जाना चाहिए?

हां। यदि आप डेटाबेस में मान डाल रहे हैं, तो आप INSERT का उपयोग कर सकते हैं। यदि कॉलम मौजूद नहीं है, तो यह आपके लिए बनाया जाएगा। अन्यथा, INSERT का प्रभाव UPDATE जैसा है। INSERT उपयोगी है जब आपके पास पूर्व-डिज़ाइन स्कीमा नहीं है (डायनामिक कॉलम फ़ैमिली, यानी कुछ भी डालें, कभी भी)। यदि आप हाथ से पहले स्कीमा डिजाइन कर रहे हैं (स्टेटिक कॉलम फैमिली, आरडीएमएस के समान) और प्रत्येक कॉलम को जानते हैं, तो आप UPDATE का उपयोग कर सकते हैं।

+0

बहुत बहुत धन्यवाद, यह वास्तव में चीजों को स्पष्ट करता है! –

+1

यह नहीं कहता कि वे वही हैं? यानी "एसक्यूएल के विपरीत, INSERT और अद्यतन के अर्थशास्त्र समान हैं।" http://www.datastax.com/docs/1.1/references/cql/INSERT – Pinocchio

42

एक सूक्ष्म अंतर है। INSERT के माध्यम से सम्मिलित रिकॉर्ड रहते हैं यदि आप सभी गैर-कुंजी फ़ील्ड को शून्य पर सेट करते हैं। यदि आप सभी गैर-कुंजी फ़ील्ड को शून्य पर सेट करते हैं तो UPDATE के माध्यम से डाले गए रिकॉर्ड्स दूर जाएं।

इस प्रयास करें:

CREATE TABLE T (
    pk int, 
    f1 int, 
    PRIMARY KEY (pk) 
); 

INSERT INTO T (pk, f1) VALUES (1, 1); 
UPDATE T SET f1=2 where pk=2; 
SELECT * FROM T; 

रिटर्न:

pk | f1 
----+---- 
    1 | 1 
    2 | 2 

अब, प्रत्येक पंक्ति शून्य पर f1 सेटिंग अपडेट।

UPDATE T SET f1 = null WHERE pk = 1; 
UPDATE T SET f1 = null WHERE pk = 2; 
SELECT * FROM T; 

ध्यान दें कि पंक्ति 1 बनी हुई है, जबकि पंक्ति 2 हटा दी गई है।

pk | f1 
----+------ 
    1 | null 

यदि आप इन्हें कैसंड्रा-क्ली का उपयोग करके देखते हैं, तो आप पंक्तियों को कैसे जोड़ते हैं, इसमें एक अलग दिखाई देगा।

मुझे यह जानना है कि यह डिज़ाइन या बग द्वारा है या नहीं और इस व्यवहार को दस्तावेज किया गया है।

+4

अच्छी पकड़! क्या आपने इस पर अधिक अंतर्दृष्टि प्राप्त की है? –

+0

यहां स्पष्टीकरण दिया गया है: https://issues.apache.org/jira/browse/CASSANDRA-11805 – Milan

0

सूक्ष्म billbaird से प्रकाश डाला अंतर के बारे में है, तो सभी गैर-प्रमुख क्षेत्रों अशक्त हैं जहां एक पंक्ति एक अद्यतन आपरेशन द्वारा बनाई हटा दिया जाएगा (मैं सीधे उस पोस्ट पर टिप्पणी करने में असमर्थ हूँ):

उम्मीद है कि व्यवहार और https://issues.apache.org/jira/browse/CASSANDRA-11805 पर बग रिपोर्ट के आधार पर एक बग नहीं है (जिसे "कोई समस्या नहीं है" के रूप में बंद किया गया था)

पहली बार स्प्रिंग डेटा का उपयोग करते समय मैं अपने आप में भाग गया। मैं एक भंडार की save(T entity) विधि का उपयोग कर रहा था, लेकिन कोई पंक्ति नहीं बनाई जा रही थी। यह पता चला कि स्प्रिंग डेटा UPDATE का उपयोग कर रहा था क्योंकि यह निर्धारित करता था कि ऑब्जेक्ट 'नया' नहीं था (यह सुनिश्चित नहीं है कि 'isNew' के लिए परीक्षण यहां समझ में आता है), और मैं उन इकाइयों के साथ परीक्षण कर रहा था जिनके पास केवल प्रमुख फ़ील्ड सेट थे ।

इस स्प्रिंग डाटा मामले के लिए, कैसेंड्रा विशेष भंडार इंटरफेस एक insert विधि (हालांकि वसंत के प्रलेखन इन विवरणों पर्याप्त या तो दस्तावेज़ नहीं है) लगातार एक INSERT उपयोग करने के लिए करता है, तो उस व्यवहार के बजाय वांछित है दिखाई देते हैं कि प्रदान करते हैं।

0

एक और सूक्ष्म अंतर (मुझे विश्वास है कि सीक्यूएल कैसंड्रा के लिए एक भयानक इंटरफ़ेस है, समान एसक्यूएल सिंटैक्स का उपयोग करने के कारण सूक्ष्मता और चेतावनी से भरा है लेकिन कुछ अलग अर्थशास्त्र) मौजूदा डेटा पर टीटीएल सेट करने के साथ है। UPDATE के साथ आप चाबियों के टीटीएल को अपडेट नहीं कर सकते हैं, भले ही नए वास्तविक मान पुराने मानों के बराबर हों। समाधान नई टीटीएल के बजाय पहले से ही

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