SQLite में, जब आप किसी तालिका में एकाधिक पंक्तियों को सम्मिलित करने का प्रयास करते हैं, और उनमें से कोई भी पंक्ति उस तालिका पर एक बाधा का उल्लंघन करती है, तो ऑपरेशन विफल हो जाएगा।
यह उम्मीद की जानी चाहिए, आखिरकार, यही बाधा है।
लेकिन क्या होगा यदि आप बाधाओं का उल्लंघन करने वाली किसी भी पंक्ति को अनदेखा करना चाहते हैं? दूसरे शब्दों में, यदि कोई पंक्ति किसी बाधा का उल्लंघन करती है, तो आप चाहते हैं कि SQLite उस पंक्ति को छोड़ दे, फिर अगली पंक्ति को संसाधित करना जारी रखे, और इसी तरह।
सौभाग्य से, SQLite में ऐसा करने का एक आसान तरीका है।
ऑन कॉन्फ्लिक्ट क्लॉज
SQLite में ON CONFLICT
है क्लॉज जो आपको यह निर्दिष्ट करने की अनुमति देता है कि बाधा संघर्षों को कैसे संभालना है। अधिक विशेष रूप से, यह UNIQUE
. पर लागू होता है , NOT NULL
, CHECK
, और PRIMARY KEY
बाधाएं (लेकिन FOREIGN KEY
बाधाएं)।
ON CONFLICT
क्लॉज का प्रयोग CREATE TABLE
. में किया जाता है कथन, लेकिन डेटा सम्मिलित करते समय, खंड को OR
. से बदल दिया जाता है ।
इसलिए, आप इस खंड का उपयोग यह निर्धारित करने के लिए कर सकते हैं कि डेटा सम्मिलित करते समय बाधा उल्लंघनों को कैसे संभालना है।
आप इस खंड के साथ पांच संभावित मूल्यों का उपयोग कर सकते हैं:
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
इस लेख के प्रयोजनों के लिए, हम IGNORE
. का उपयोग करेंगे विकल्प।
IGNORE
का उपयोग करना SQLite को एक पंक्ति को छोड़ने का कारण बनता है जिसमें बाधा उल्लंघन होता है और बाद की पंक्तियों को संसाधित करना जारी रखता है जैसे कि कुछ भी गलत नहीं हुआ।
उदाहरण
यहां एक CREATE TABLE
है उत्पाद . नामक तालिका के लिए विवरण :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
ध्यान दें कि इस तालिका में एक NOT NULL
शामिल है ProductName . पर प्रतिबंध स्तंभ।
आइए अब उस बाधा का उल्लंघन करने वाले डेटा को सम्मिलित करने का प्रयास करें।
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
परिणाम:
Error: NOT NULL constraint failed: Products.ProductName
आश्चर्य नहीं कि हमें एक त्रुटि मिलती है जो दर्शाती है कि NOT NULL
प्रतिबंध का उल्लंघन किया गया था।
अब देखते हैं कि तालिका में कितनी पंक्तियाँ सम्मिलित की गईं।
SELECT COUNT(*) FROM Products;
परिणाम:
0
इसलिए हम जानते हैं कि केवल दूसरी पंक्ति ने बाधा का उल्लंघन किया है, लेकिन इससे कोई भी . रोका जा सकता है डालने से डेटा।
हम OR IGNORE
. जोड़कर इसे बदल सकते हैं हमारे INSERT
. पर कथन:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
बस इतना ही आवश्यक है। इस कोड को चलाने से पिछले कोड की तरह कोई त्रुटि नहीं होती है। इस कोड को चलाने से अच्छा डेटा डाला जाता है, और खराब डेटा को नज़रअंदाज़ किया जाता है।
अब अगर हम SELECT
. चलाते हैं तालिका के खिलाफ बयान, हम देख सकते हैं कि वास्तव में अच्छा डेटा डाला गया था।
SELECT * FROM Products;
परिणाम:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75