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 कथनों के कारण हुए परिवर्तन संरक्षित हैं और लेन-देन सक्रिय रहता है।