http://en.wikipedia.org/wiki/Upsert
SQL सर्वर पर अद्यतन संग्रहीत संग्रह सम्मिलित करें
क्या SQLite में ऐसा करने का कोई चतुर तरीका है जिसके बारे में मैंने नहीं सोचा है?
मूल रूप से मैं चार कॉलम में से तीन को अपडेट करना चाहता हूं यदि रिकॉर्ड मौजूद है, अगर यह मौजूद नहीं है तो मैं चौथे कॉलम के लिए डिफ़ॉल्ट (एनयूएल) मान के साथ रिकॉर्ड को सम्मिलित करना चाहता हूं।
आईडी एक प्राथमिक कुंजी है, इसलिए यूपीएसईआरटी का केवल एक ही रिकॉर्ड होगा।
(यदि मुझे स्पष्ट रूप से अद्यतन करने की आवश्यकता है या नहीं, यह निर्धारित करने के लिए मैं चयन के ओवरहेड से बचने की कोशिश कर रहा हूं)
सुझाव?
मैं पुष्टि नहीं कर सकता कि टेबल साइट के लिए SQLite साइट पर सिंटैक्स। मैंने इसका परीक्षण करने के लिए डेमो नहीं बनाया है, लेकिन यह समर्थित नहीं लगता है।
यदि यह था, तो मेरे पास तीन कॉलम हैं, तो यह वास्तव में ऐसा दिखेगा:
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
लेकिन पहली दो बूँदें संघर्ष का कारण नहीं बनेंगी, केवल ID ही होगी इसलिए मैं Blob1 और Blob2 को प्रतिस्थापित नहीं करूँगा (वांछित के रूप में)
बाइंडिंग डेटा में UPDATEs एक पूर्ण लेनदेन है, जिसका अर्थ है कि अद्यतन की जाने वाली प्रत्येक प्रेषित पंक्ति की आवश्यकता है: INSERT के विपरीत स्टेटमेंट तैयार / बिंद / चरण / अंतिम रूप दें जो रीसेट फ़ंक्शन के उपयोग की अनुमति देता है
स्टेटमेंट ऑब्जेक्ट का जीवन कुछ इस तरह से होता है:
- Sqlite3_prepare_v2 () का उपयोग करके ऑब्जेक्ट बनाएं
- Sqlite3_bind_ इंटरफेस का उपयोग कर मापदंडों को होस्ट करने के लिए मानों को बांधें।
- Sqlite3_step () कॉल करके SQL चलाएँ
- Sqlite3_reset () का उपयोग करके कथन को रीसेट करें और फिर चरण 2 पर जाएं और दोहराएं।
- Sqlite3_finalize () का उपयोग करते हुए स्टेटमेंट ऑब्जेक्ट को नष्ट करें।
अद्यतन मैं अनुमान लगा रहा हूं कि INSERT की तुलना में धीमा है, लेकिन प्राथमिक कुंजी का उपयोग करके SELECT की तुलना कैसे करता है?
शायद मुझे 4 वें कॉलम (Blob3) को पढ़ने के लिए चयन का उपयोग करना चाहिए और फिर पहले 3 कॉलम के लिए नए डेटा के साथ मूल 4 वें कॉलम को सम्मिश्रित करते हुए एक नया रिकॉर्ड लिखने के लिए REPLACE का उपयोग करना चाहिए?