अगर SQLite में अगर नहीं है तो कैसे करें


80

मैं इस लाइन को MS SQL Server से SQLite में पोर्ट करने की कोशिश कर रहा हूँ

IF NOT EXISTS(SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received') 
    INSERT INTO EVENTTYPE (EventTypeName) VALUES ('ANI Received');

ऐसा लगता है कि SQLite IF NOT EXISTS का समर्थन नहीं करता है या कम से कम मैं इसे काम नहीं कर सकता। क्या मुझे कुछ सरल याद आ रहा है? क्या आसपास कोई काम है?

जवाबों:


120

इस बारे में कैसा है?

INSERT OR IGNORE INTO EVENTTYPE (EventTypeName) VALUES 'ANI Received'

(बिना शीर्षक के मेरे पास SQLite नहीं है ... हालाँकि यह लिंक काफी वर्णनात्मक है।)

इसके अतिरिक्त, यह भी काम करना चाहिए:

INSERT INTO EVENTTYPE (EventTypeName)
SELECT 'ANI Received'
WHERE NOT EXISTS (SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received');

14
धन्यवाद। हालाँकि, यह ध्यान दिया जाना चाहिए कि INSERT या IGNORE टुकड़ा केवल तभी काम करता है जब EventTypeName अद्वितीय होने के लिए सेट किया गया हो।
एंग्रीहैकर

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

यदि EventTypeName अद्वितीय नहीं है, तो क्या दूसरी विधि वास्तव में उपयोग की जा सकती है? मैं भी कुछ ऐसा ही करने की कोशिश कर रहा हूं और मुझे पता चला है कि सिलेक्ट व्हॉट्स नॉट एग्जिट क्लॉज कई पंक्तियों को लौटा रहा है, वास्तव में हर पंक्ति जहां (समतुल्य) EventTypeName! = 'ANI प्राप्त' सत्य है।
माइकल

EventTypeName अद्वितीय होने का इरादा रखता है। नया मान 'ANI प्राप्त' केवल तालिका EVENTTYPE में डाला गया है यदि यह तालिका में पहले से मौजूद नहीं है। यही वह जगह है, जिसमें कोई चीज नहीं आती है। जहां भी एक्जिट क्लॉज नहीं है वहां सिलेक्ट करें केवल एक ही पंक्ति में वापस आ सकते हैं; वहाँ से कोई खंड नहीं है - कोई रास्ता नहीं है कि कई पंक्तियों को वापस किया जा सकता है। आशा है कि यह इसे साफ करता है।
समुद्र तट

1
यह बहुत ही खराब कोडिंग स्टाइल है। हर त्रुटि पर क्वेरी चुपचाप विफल हो जाएगी! डॉक्स से: IGNOREजब एक लागू बाधा उल्लंघन होता है, तो IGNORE रिज़ॉल्यूशन एल्गोरिथम एक पंक्ति को रोक देता है जिसमें बाधा उल्लंघन होता है और SQL कथन की बाद की पंक्तियों को संसाधित करना जारी रखता है जैसे कि कुछ भी गलत नहीं हुआ। अन्य पंक्तियों से पहले और बाद की पंक्ति जिसमें बाधा उल्लंघन सम्मिलित थे या सामान्य रूप से अपडेट किए गए थे। IGNORE संघर्ष समाधान एल्गोरिथ्म का उपयोग किए जाने पर कोई त्रुटि नहीं दी जाती है।
मैनुएल श्नाइड 3r

12

यदि आप मौजूदा मूल्य के सम्मिलन को अनदेखा करना चाहते हैं, तो आपकी तालिका में एक कुंजी फ़ील्ड होनी चाहिए। जैसे प्राथमिक कुंजी फ़ील्ड के साथ एक तालिका बनाएं:

CREATE TABLE IF NOT EXISTS TblUsers (UserId INTEGER PRIMARY KEY, UserName varchar(100), ContactName varchar(100),Password varchar(100));

और फिर तालिका में सम्मिलित करें या बदलें / सम्मिलित करें या उपेक्षा करें:

INSERT OR REPLACE INTO TblUsers (UserId, UserName, ContactName ,Password) VALUES('1','UserName','ContactName','Password');

यह मौजूदा प्राथमिक कुंजी मान को फिर से दर्ज नहीं करने देगा ... यह है कि आप यह जाँच सकते हैं कि मान तालिका में मौजूद है या नहीं।


1

आप कुंजी फ़ील्ड के साथ तालिका पर एक बाधा भी स्थापित कर सकते हैं और संघर्ष को "अनदेखा" कर सकते हैं

जब एक लागू बाधा उल्लंघन होता है, तो IGNORE संकल्प एल्गोरिथ्म एक पंक्ति को रोकता है जिसमें बाधा उल्लंघन होता है और SQL कथन की बाद की पंक्तियों को संसाधित करना जारी रखता है जैसे कि कुछ भी गलत नहीं हुआ। अन्य पंक्तियों से पहले और बाद की पंक्ति जिसमें बाधा उल्लंघन सम्मिलित थे या सामान्य रूप से अपडेट किए गए थे। IGNORE संघर्ष समाधान एल्गोरिथ्म का उपयोग किए जाने पर कोई त्रुटि नहीं दी जाती है।

SQLite प्रलेखन

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