2010-08-13 17 views
6

इस एसक्यूएल बयानएक ही तालिका में दूसरे मूल्य के साथ एक स्तंभ अपडेट कर रहा है

Create table abc 
(A int, 
B int 
) 

insert into abc values (1,2) 

निम्न विवरण के दोनों एक ही बात करते हैं पर विचार करें। क्यूं कर?

update abc 
set A = B, 
B =0 
where A=1 

और

update abc 
set B =0, 
A = B 
where A=1 

मैं सोच रहा था बाद में बयान में B कॉलम मूल्य पहले से सेट है और फिर A कॉलम 'मूल्य B's मूल्य

उत्तर

8

सं एकल अद्यतन बयान कर रहे हैं के लिए सेट है परमाणु और उनके व्यक्तिगत भागों में कोई आदेश नहीं है।

इन दोनों:

update abc set A = B, B = 0 where A=1 
update abc set B = 0, A = B where A=1 

कर बिल्कुल एक ही बात है क्योंकि दो कार्य समवर्ती होने के लिए माना जाता है।

दूसरे शब्दों में, = के दाईं ओर B का पुराना मान है।


परिशिष्ट: कैसे एक डीबीएमएस इस व्यवहार को लागू करता है डीबीएमएस लेखन उन की चतुराई पर निर्भर करता है।

उदाहरण के लिए

एक डीबीएमएस पराक्रम सभी पंक्तियों जहां A 1 तो है, एक बार यह हो जाने पर, के माध्यम से A स्थापित करने जा सकते हैं और इसी क्रम में A = B, B = 0 (निष्पादित क्योंकि निष्पादन इंजन है कि पूरा करेगा संगामिति समझे, लॉक करने के लिए प्रयास उन पंक्तियों में से प्रत्येक पर B बदलने से पहले B पर)।

set A = B, B = A की तरह एक बयान कुछ और अधिक खुफिया की आवश्यकता होगी, लेकिन यह है कि आसानी से पर्याप्त कर सकता है पहले वर्तमान पंक्ति बचत और वहाँ मानों का उपयोग कर मूल्यों नई पंक्ति में, की तरह कुछ स्थापित करने के लिए द्वारा:

read in oldrow 
copy oldrow to newrow 
newrow.A = oldrow.B 
newrow.B = oldrow.A 
write out newrow 

तो यह सभी पंक्तियों को अनलॉक कर देगा।

यह सिर्फ एक विकल्प है। एक बहुत गूंगा डीबीएमएस सिर्फ पूरे डेटाबेस फ़ाइल को लॉक कर सकता है हालांकि यह बहुत बुद्धिमान समेकन के लिए नहीं होगा।

एक एकल उपयोगकर्ता, सिंगल-थ्रेड डीबीएमएस को समरूपता की परवाह नहीं है। यह परिवर्तन करने के लिए, प्रत्येक प्रासंगिक पंक्ति के माध्यम से बस कुछ भी नहीं लॉक होगा।

+0

क्या दोनों पढ़ते और लिखते हैं एक ही समय में होता है? एसक्यूएल सर्वर कैसे काम करता है में यह कोई समरूपता नहीं बनाता है? – IsmailS

+0

+1 धन्यवाद ...... – IsmailS

3

एसक्यूएल फ़ील्ड के क्रम में मूल्यों का मूल्यांकन नहीं करता है। जहां तक ​​एसक्यूएल का सवाल है, बयान समान हैं।

अद्यतन एक चरण (परमाणु) में होता है, कई आदेशित नहीं।

क्या होता है, तो एक ही समय में B और की वर्तमान मूल्य के लिए A अद्यतन करता है यह आप समझ में मदद करता है, तो अपडेट B 0.

हो सकता है, कि SQL तालिका में प्रत्येक पंक्ति तक पहुँचता है आप इसके बारे में सोच सकते हैं कि अपडेट ट्रिगर में क्या होता है, जिसकी DELETED तार्किक तालिका में तालिका के वर्तमान मान तक पहुंच है और INSERTED तार्किक तालिका में नए मानों तक पहुंच है।

+0

क्या पढ़ता है और लिखता है दोनों एक ही समय में होता है? एसक्यूएल सर्वर कैसे काम करता है में यह कोई समरूपता नहीं बनाता है? – IsmailS

+0

आप पढ़ नहीं रहे हैं। आप एक लिख रहे हैं। – Oded

+0

यदि आप कथन का पालन करते हैं तो मैं वास्तव में 'बी' का मान पढ़ रहा हूं और इसे 'ए' पर सेट कर रहा हूं। – IsmailS

0

अब मैं समझता हूं कि, दो लॉजिकल टेबल i.e DELETED और INSERTED हैं जो एक अद्यतन कथन चलाते समय चित्र में आते हैं।

तो मूल्य को A स्तंभ DELETED तालिका के B स्तंभ और जो 0 पर सेट किया जा रहा है INSERTED तालिका में से एक है B का मूल्य से लिया गया है स्थापित किया जा रहा।

2

@ इस्माइल के उत्तर पर भिन्नता: तर्कसंगत रूप से बोलना, एक अद्यतन एक डिलीट और एक सम्मिलित है जो एक साथ किया जाता है, यही कारण है कि आप क्रमशः प्रत्येक लॉजिकल टेबल deleted और inserted में पंक्ति प्राप्त करते हैं। यहां काम की इकाई पंक्ति है: जब एक पंक्ति अपडेट की जाती है तो इसे हटा दिया जाता है और नए मानों का उपयोग करके पुनः डाला जाता है (यदि आप जानना चाहते हैं कि कौन से कॉलम मान वास्तव में बदलते हैं तो आपको इसे स्वयं से बाहर करना होगा)।

एक उपयोगी ख़त कि

UPDATE MyTable 
    SET A = B, B = A; 

कॉलम 'मूल्यों स्थानांतरित होगा।

+0

+1 धन्यवाद ...... – IsmailS

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