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

SQLite में डेटा सम्मिलित करते समय NULL मानों को कॉलम के डिफ़ॉल्ट मान में बदलें

SQL के लिए SQLite के गैर-मानक एक्सटेंशन में से एक है ON CONFLICT खंड।

यह खंड आपको यह निर्धारित करने की अनुमति देता है कि क्या होना चाहिए जब एक बाधा उल्लंघन के कारण कुछ संघर्ष होते हैं।

जिन चीजों के लिए आप इस क्लॉज का उपयोग कर सकते हैं उनमें से एक है NULL . को बदलना तालिका में डेटा डालने या अपडेट करते समय कॉलम के डिफ़ॉल्ट मान वाले मान।

डिफ़ॉल्ट रूप से, यदि आप स्पष्ट रूप से NULL insert डालने का प्रयास करते हैं एक कॉलम में NOT NULL . के साथ बाधा, यह विफल हो जाएगा।

और यदि आप स्पष्ट रूप से NULL insert डालने का प्रयास करते हैं एक कॉलम में बिना एक NOT NULL बाधा, फिर NULL उस कॉलम को असाइन किया जाएगा, भले ही कोई DEFAULT . हो खंड।

हालांकि, आप ON CONFLICT . का उपयोग कर सकते हैं इसे NULL . के बजाय डिफ़ॉल्ट मान पर सेट करने के लिए क्लॉज ।

उदाहरण

निम्नलिखित कोड दर्शाता है कि मेरा क्या मतलब है।

DROP TABLE IF EXISTS Products;

CREATE TABLE Products( 
    ProductId INTEGER PRIMARY KEY, 
    ProductName NOT NULL, 
    Price NOT NULL ON CONFLICT REPLACE DEFAULT 0.00
);

INSERT INTO Products (ProductId, ProductName, Price) VALUES 
    (1, 'Widget Holder', NULL);

SELECT * FROM Products;

इस उदाहरण में मैं ON CONFLICT REPLACE . का उपयोग करता हूं NULL सेट करने के लिए NULL . के बजाय डिफ़ॉल्ट मान के मान ।

यह रहा SELECT का परिणाम अंतिम पंक्ति पर कथन:

ProductId   ProductName    Price     
----------  -------------  ----------
1           Widget Holder  0.0       

हम देख सकते हैं कि कीमत कॉलम में 0.0 का डिफ़ॉल्ट मान है, भले ही मैंने स्पष्ट रूप से NULL डालने का प्रयास किया हो ।

देखते हैं कि अगर मैं NOT NULL को हटा दूं तो क्या होगा? बाधा।

DROP TABLE IF EXISTS Products;

CREATE TABLE Products( 
    ProductId INTEGER PRIMARY KEY, 
    ProductName NOT NULL, 
    Price DEFAULT 0.00
);

INSERT INTO Products (ProductId, ProductName, Price) VALUES 
    (1, 'Widget Holder', NULL);

SELECT * FROM Products;

परिणाम:

ProductId   ProductName    Price     
----------  -------------  ----------
1           Widget Holder            

अब कॉलम में NULL है ।

पूर्ण रूप से पूर्ण रूप से सम्मिलित करना

यह ध्यान रखना महत्वपूर्ण है कि यह लेख मुख्य रूप से NULL . डालने से संबंधित है स्पष्ट रूप से .

यदि आप NULL insert डालने का प्रयास करते हैं अस्पष्ट रूप से , तो पिछला उदाहरण एक अलग परिणाम देगा।

मेरा मतलब यह है कि यदि आप INSERT . में कॉलम शामिल नहीं करते हैं स्टेटमेंट, DEFAULT बाधा स्वचालित रूप से उपयोग की जाएगी। यही है DEFAULT जब आप स्पष्ट रूप से एक मूल्य प्रदान नहीं करते हैं तो बाधाएँ होती हैं - एक मूल्य प्रदान करने के लिए।

जब मैं ऐसा करता हूं तो यहां क्या होता है।

DROP TABLE IF EXISTS Products;

CREATE TABLE Products( 
    ProductId INTEGER PRIMARY KEY, 
    ProductName NOT NULL, 
    Price DEFAULT 0.00
);

INSERT INTO Products (ProductId, ProductName) VALUES 
    (1, 'Widget Holder');

SELECT * FROM Products;

परिणाम:

ProductId   ProductName    Price     
----------  -------------  ----------
1           Widget Holder  0.0       

इसलिए मैंने केवल कीमत . को हटा दिया था INSERT . से कॉलम बयान।

INSERT कथन के लिए संघर्ष पर

पहला उदाहरण ON CONFLICT . का उपयोग करता है CREATE TABLE पर बयान।

लेकिन क्या होगा यदि तालिका ON CONFLICT के साथ नहीं बनाई गई थी खंड?

सौभाग्य से, INSERT . पर इसका उपयोग करने का एक तरीका भी है बयान।

वाक्यविन्यास थोड़ा अलग है। जब INSERT . पर उपयोग किया जाता है आपको ON CONFLICT बदलने की जरूरत है OR . के साथ ।

आइए इस पद्धति का उपयोग करने के लिए कोड को संशोधित करें।

DROP TABLE IF EXISTS Products;

CREATE TABLE Products( 
    ProductId INTEGER PRIMARY KEY, 
    ProductName NOT NULL, 
    Price NOT NULL DEFAULT 0.00
);

INSERT OR REPLACE INTO Products (ProductId, ProductName, Price) VALUES 
    (1, 'Widget Holder', NULL);

SELECT * FROM Products;

परिणाम:

ProductId   ProductName    Price     
----------  -------------  ----------
1           Widget Holder  0.0       

इसलिए मैंने INSERT INTO . को बदल दिया INSERT OR REPLACE INTO . के साथ ।

यहाँ परिणाम क्या होगा यदि मैंने उस खंड को नहीं डाला होता।

DROP TABLE IF EXISTS Products;

CREATE TABLE Products( 
    ProductId INTEGER PRIMARY KEY, 
    ProductName NOT NULL, 
    Price NOT NULL DEFAULT 0.00
);

INSERT INTO Products (ProductId, ProductName, Price) VALUES 
    (1, 'Widget Holder', NULL);

SELECT * FROM Products;

परिणाम:

Error: NOT NULL constraint failed: Products.Price

कोई डिफ़ॉल्ट बाधा नहीं?

उस स्थिति में जब आप ON CONFLICT . का उपयोग करते हैं बिना DEFAULT के कॉलम पर क्लॉज बाधा, SQL कथन को SQLITE_CONSTRAINT त्रुटि के साथ निरस्त कर दिया गया है वर्तमान SQL कथन द्वारा किए गए किसी भी परिवर्तन का समर्थन किया जाता है; लेकिन उसी लेन-देन के भीतर पूर्व SQL कथनों के कारण हुए परिवर्तन संरक्षित हैं और लेन-देन सक्रिय रहता है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. <expr> अपेक्षित, मिला '?'

  2. कैसे बदलें () SQLite में काम करता है

  3. SQLite - डेटा डालें

  4. SQLite में किसी विशेष दिनांक/समय के बाद से सेकंड की संख्या की गणना करें

  5. एंड्रॉइड एप्लिकेशन के भीतर SQLite क्वेरी कैसे करें?