2010-02-12 15 views
46

मैंने कभी भी एसक्यूएल में इस्तेमाल किए गए वाक्यविन्यास INSERT OR REPLACE INTO names (id, name) VALUES (1, "John") को कभी नहीं देखा है, और मैं सोच रहा था कि यह UPDATE names SET name = "John" WHERE id = 1 से बेहतर क्यों है। एक दूसरे पर एक का उपयोग करने के लिए कोई अच्छा कारण है। क्या यह वाक्यविन्यास SQLite के लिए विशिष्ट है?SQLite "INSERT या स्थानांतरित करें" बनाम "अद्यतन करें ... कहां"

उत्तर

76

यदि पंक्ति मौजूद नहीं है तो अद्यतन कुछ भी नहीं करेगा।

जहां पंक्ति मौजूद नहीं है, या यदि मूल्य करता है तो मूल्यों को प्रतिस्थापित करें, जहां INSERT या REPLACE डालेंगे।

+0

उत्तर के लिए धन्यवाद। क्या यह एक SQLite विशिष्ट बात है? –

+0

मैं इस SQL ​​सर्वर में इस बारे में नहीं हूं, हालांकि SQL सर्वर में अब एक MERGE कमांड है। और रोम एमएस एक्सेस I ने इस तरह कुछ भी देखा है। –

+0

mysql ने "प्रतिस्थापित" किया है। – fastmultiplication

4

आईडी = 1 पहले से मौजूद नहीं है तो सम्मिलित या प्रतिस्थापित क्वेरी एक नया रिकॉर्ड डालेगी।

अद्यतन क्वेरी केवल oudate id = 1 होगी यदि यह अस्तित्व में है, तो यह अस्तित्व में नहीं होने पर एक नया रिकॉर्ड नहीं बनाएगा।

+2

मुझे नहीं लगता कि यह सही है। स्क्लाइट प्रलेखन (1 जुलाई 2010, संस्करण 3.6.23.1 के अनुसार) कहता है कि 'स्थान INSERT या स्थान के लिए एक उपनाम है, और इसलिए वही व्यवहार होगा। मेरे अनुभव में यह मामला है .. – fostandy

+0

मुझे लगता है कि यह एक डिलीट करेगा-> अगर यह एक संघर्ष पाता है तो डालें – StErMi

+1

@ फोस्टंडी रीप्लेस वास्तव में INSERT या स्थान के लिए एक उपनाम है, लेकिन जिस उत्तर पर आप टिप्पणी कर रहे हैं उसके बारे में बात कर रहा है अद्यतन (क्योंकि यही सवाल था)। – hatfinch

29

मैं वर्तमान में इस तरह के एक बयान पर काम कर रहा हूं और नोटिस करने के लिए एक और तथ्य निकाला है: इंसर्ट या प्रतिस्थापन किसी भी मूल्य को प्रतिस्थापन में प्रदान नहीं किया जाएगा। उदाहरण के लिए यदि आपकी तालिका में एक स्तंभ "अंतिम नाम" है जिसमें आपने कोई मान नहीं दिया है, तो INSERT या REPLACE यदि संभव हो तो "अंतिम नाम" को समाप्त कर देगा (बाधाएं इसे अनुमति दें) या असफल हो जाएंगी।

+7

+1; इसे अलग-अलग रखने के लिए: हमेशा "अद्यतन" पंक्ति के मूल्य_ के पूर्ण सेट को निर्दिष्ट करना चाहिए - कोई मौजूदा मान संरक्षित नहीं है; इस व्यवहार का कारण यह है कि वास्तव में मौजूदा पंक्ति के लिए * अपडेट * ऑपरेशन नहीं है, लेकिन एक विलोपन, फिर से सम्मिलन के बाद। – mklement0

5
REPLACE INTO table(column_list) VALUES(value_list); 

INSERT OR REPLACE INTO table(column_list) VALUES(value_list); 

के लिए की एक छोटी रूप है, अमल करने के लिए सही ढंग से अपनी मेज संरचना अद्वितीय पंक्तियां होनी चाहिए REPLACE कि क्या एक साधारण प्राथमिक कुंजी या एक अद्वितीय सूचकांक।

प्रतिस्थापन हटा देता है, फिर रिकॉर्ड दर्ज करता है और यदि आप उन्हें सेटअप करते हैं तो एक INSERT ट्रिगर निष्पादित करने का कारण बनता है। यदि आपके पास INSERT पर ट्रिगर है, तो आपको समस्याएं आ सकती हैं।


यह एक काम के आसपास .. गति की जाँच नहीं की ..

INSERT OR IGNORE INTO table (column_list) VALUES(value_list); 

द्वारा

UPDATE table SET field=value,field2=value WHERE uniqueid='uniquevalue' 

यह विधि एक एक ट्रिगर पैदा करने के बिना होने के लिए बदलने के लिए अनुमति देता है का पालन किया है।

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