(मेरा उत्तर से कम है, लेकिन यह है कि मुझे एहसास हुआ कि बाद Insert into a MySQL table or update if exists में इस पर एक बेहतर सवाल & जवाब है)
012 डाला जाएगा
आप देख सकते हैं पंक्ति मौजूद है, और फिर सम्मिलित या अपडेट करें, लेकिन यह आप दो एसक्यूएल बजाय संचालन एक प्रदर्शन किया जाएगा की गारंटी देता है:
- जांच करता है, तो पंक्ति मौजूद है
- डालने या अद्यतन पंक्ति
एक बेहतर समाधान हमेशा पहले अद्यतन करने के लिए है, और अगर कोई भी पंक्ति को अद्यतन किया गया है, तो एक सम्मिलित करें, जैसे ऐसा:
update table1
set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
where id = 'val1'
if @@ROWCOUNT = 0
insert into table1(id, name, itemname, itemcatName, itemQty)
values('val1', 'val2', 'val3', 'val4', 'val5')
यह या तो पंक्ति में पहले से मौजूद है या नहीं, इस पर निर्भर करता है कि यह एक एसक्यूएल ऑपरेशंस या दो एसक्यूएल ऑपरेशंस लेगा।
लेकिन यदि प्रदर्शन वास्तव में एक मुद्दा है, तो आपको यह पता लगाने की आवश्यकता है कि ऑपरेशन INSERT या UPDATE के होने की अधिक संभावना है या नहीं। यदि अद्यतन अधिक आम हैं, तो ऊपर करें। यदि INSERT अधिक आम हैं, तो आप इसे विपरीत में कर सकते हैं, लेकिन आपको त्रुटि प्रबंधन जोड़ना होगा। अगर आप एक अद्यतन या सम्मिलित करने की ज़रूरत
BEGIN TRY
insert into table1(id, name, itemname, itemcatName, itemQty)
values('val1', 'val2', 'val3', 'val4', 'val5')
END TRY
BEGIN CATCH
update table1
set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
where id = 'val1'
END CATCH
वास्तव में कुछ होने के लिए, आप एक ही लेन-देन के भीतर दो आपरेशन क्या करना है। सैद्धांतिक रूप से, पहले अद्यतन या INSERT (या यहां तक कि EXISTS चेक) के ठीक बाद, लेकिन अगले INSERT/UPDATE स्टेटमेंट से पहले, डेटाबेस बदल सकता था, जिससे दूसरा कथन विफल हो गया। यह बहुत दुर्लभ है, और लेनदेन के लिए ओवरहेड इसके लायक नहीं हो सकता है।
वैकल्पिक रूप से, आप एक एकल एसक्यूएल ऑपरेशन का उपयोग कर सकते हैं जिसे एमईआरईजी या तो एक आईएनएसईआरटी या अद्यतन करने के लिए कहा जाता है, लेकिन यह शायद इस एक-पंक्ति ऑपरेशन के लिए भी अधिक है।
SQL transaction statements, race conditions, SQL MERGE statement पढ़ने पर विचार करें।
इसके साथ ** मेरिज क्लॉज ** का उपयोग करने के बारे में उपयोगकर्ता के विवरण के साथ एक अस्थायी तालिका? क्या यह बेहतर नहीं है? –
साखाइल - हाँ यह है - तो आपका जवाब कहां है ... उत्तर .. अनुभाग? –
'MERGE' इस उपयोग के मामले के लिए उपयुक्त होगा लेकिन यह ध्यान दिया जाना चाहिए कि इसे केवल SQL Server 2008 में पेश किया गया था (संभवतः, ओपी अभी भी छह साल बाद 2005 का उपयोग नहीं कर रहा है)। –