एक कमांड में इंट कॉलम के लिए SQL को कैसे बढ़ाया या घटाया जा सकता है


119

मेरे पास एक आदेश तालिका है जिसमें एक मात्रा स्तंभ है। चेक इन या चेक आउट के दौरान, हमें उस क्वांटिटी कॉलम को एक-एक करके अपडेट करना होगा। क्या एक कार्रवाई में ऐसा करने का कोई तरीका है या हमें मौजूदा मूल्य प्राप्त करना है और फिर उसके ऊपर एक या शून्य जोड़ना है?

एक और सवाल यह है कि जब हम एक नई पंक्ति सम्मिलित करते हैं, तो क्या हमें यह जाँचने की आवश्यकता है कि क्या वही डेटा विद्यमान है या नहीं, यदि दो चरण हैं, तो सम्मिलित करें या ऐसा करने का एक बेहतर तरीका है?

धन्यवाद,

जवाबों:


250

पहले उत्तर के लिए:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...

दूसरे का जवाब देने के लिए:

इसे करने बहुत सारे तरीके हैं। चूँकि आपने एक डेटाबेस निर्दिष्ट नहीं किया था, इसलिए मैं MySQL मान लूंगा।

  1. INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2
  2. REPLACE INTO table SET x=1, y=2

वे दोनों आपके प्रश्न को संभाल सकते हैं। हालांकि, पहला सिंटैक्स रिकॉर्ड को अपडेट करने के बजाय अधिक लचीलेपन के लिए अनुमति देता है (जैसा कि दूसरा करता है)।

ध्यान रखें कि दोनों को अस्तित्व में रखने के लिए, एक UNIQUE कुंजी निर्धारित होनी चाहिए ...


32
चूँकि आपने डेटाबेस निर्दिष्ट नहीं किया था, आपको वास्तव में मानक SQL मान लेना चाहिए।
पैक्सिडाब्लो

12

पहले प्रश्न का एकल-चरण उत्तर कुछ इस तरह का उपयोग करना है:

update TBL set CLM = CLM + 1 where key = 'KEY'

यह बहुत ही एक करने का निर्देश तरीका है।

दूसरे प्रश्न के लिए, UPSERTआपको इच्छित परिणाम प्राप्त करने के लिए DBMS- विशिष्ट SQL जिम्नास्टिक (जैसे ) का सहारा लेने की आवश्यकता नहीं होनी चाहिए । अपडेट-या-इंसर्ट करने के लिए एक मानक विधि है जिसमें एक विशिष्ट DBMS की आवश्यकता नहीं होती है।

try:
    insert into TBL (key,val) values ('xyz',0)
catch:
    do nothing
update TBL set val = val + 1 where key = 'xyz'

यानी आप पहले रचना को करने की कोशिश करते हैं। यदि यह पहले से ही है, तो त्रुटि को अनदेखा करें। अन्यथा आप इसे 0 मान से बनाते हैं।

फिर अपडेट करें जो सही ढंग से काम करेगा या नहीं:

  • पंक्ति मूल रूप से अस्तित्व में थी।
  • किसी ने इसे आपके डालने और अद्यतन के बीच अद्यतन किया।

यह एक निर्देश नहीं है और अभी तक, आश्चर्यजनक रूप से पर्याप्त है, यह है कि हम इसे लंबे समय से सफलतापूर्वक कैसे कर रहे हैं।


4

अगर मेरी समझ सही है, तो अपडेट बहुत सरल होना चाहिए। मैं बस निम्नलिखित करूँगा।

UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0

आपको सभी पंक्तियों के बजाय केवल एक पंक्ति को अपडेट करने के लिए अतिरिक्त फिल्टर की आवश्यकता हो सकती है।

आवेषण के लिए, आप अपने रिकॉर्ड से संबंधित कुछ अनूठी आईडी को स्थानीय रूप से कैश कर सकते हैं और इस कैश के खिलाफ जांच कर सकते हैं और यह तय कर सकते हैं कि सम्मिलित करना है या नहीं। वैकल्पिक दृष्टिकोण हमेशा पीके उल्लंघन त्रुटि के लिए सम्मिलित करना और जांचना है क्योंकि यह एक अनावश्यक प्रविष्टि है।


4
UPDATE Orders Order
SET Order.Quantity =  Order.Quantity - 1
WHERE SomeCondition(Order)

जहां तक ​​मुझे पता है कि SQL में INSERT-OR-UPDATE के लिए कोई बिल्ड-इन सपोर्ट नहीं है। मैं एक संग्रहीत प्रक्रिया बनाने या इसे प्राप्त करने के लिए एक सशर्त क्वेरी का उपयोग करने का सुझाव देता हूं। यहां आप विभिन्न डेटाबेस के लिए समाधानों का संग्रह पा सकते हैं।


आप एक वाक्यविन्यास त्रुटि को आरक्षित शब्द ORDER को इस तरह से फेंक सकते हैं ...
gahooa

0

दूसरे का जवाब देना:

यदि यह समान मान पर सेट है, तो स्तंभ को विशिष्ट बनाएं और अपवाद को पकड़ें।


0

@dotjoe @@ rowcount को अपडेट करना और जांचना सस्ता है, इसके बाद तथ्य डालें।

अपवाद महंगे हैं और && अद्यतन अधिक लगातार हैं

सुझाव: यदि आप अपने DAL में uber परफॉर्मर बनना चाहते हैं, तो पंक्ति को अपडेट करने के लिए एक विशिष्ट ID में फ्रंट एंड पास बनाएं, अगर null डालें।

DAL को CRUD होना चाहिए, और स्टेटलेस होने के बारे में चिंता करने की आवश्यकता नहीं है।

यदि आप इसे स्टेटलेस बनाते हैं, तो अच्छे इंडेक्स के साथ, आपको निम्न एसक्यूएल बनाम 1 स्टेटमेंट के साथ एक अंतर दिखाई नहीं देगा। IF (सेलेक्ट टॉप 1 * फॉर्म x जहां PK = @ ID) अन्य अपडेट डालें

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