SQLite
 sql >> डेटाबेस >  >> RDS >> SQLite

SQLite में डेटा डालने पर बाधाओं का उल्लंघन करने वाली पंक्तियों को कैसे छोड़ें?

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     


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite दिनांक/समय कार्यों के लिए मान्य संशोधक

  2. execSQL () अद्यतन के साथ अद्यतन नहीं होता है

  3. लॉगकैट अमान्य कॉलम डेटा 1 कहता है

  4. SQLite को छोड़कर ऑपरेटर

  5. SQLite डेटाबेस से और उसके लिए बाइट सरणी (छवि डेटा) को कैसे स्टोर और पुनर्प्राप्त करें?