SQLite में एक गैर-मानक SQL एक्सटेंशन क्लॉज़ है, जिसे ON CONFLICT
. कहा जाता है जो हमें यह निर्दिष्ट करने में सक्षम बनाता है कि बाधाओं के संघर्षों से कैसे निपटा जाए।
विशेष रूप से, यह खंड UNIQUE
. पर लागू होता है , NOT NULL
, CHECK
, और PRIMARY KEY
बाधाएं।
यह आलेख इस बात के उदाहरण प्रदान करता है कि प्राथमिक कुंजी बाधा विरोधों को कैसे संभालना है यह निर्धारित करने के लिए इस खंड का उपयोग कैसे किया जा सकता है।
"प्राथमिक कुंजी बाधा संघर्ष" से मेरा मतलब है कि जब आप प्राथमिक कुंजी कॉलम में डुप्लिकेट मान डालने का प्रयास करते हैं। डिफ़ॉल्ट रूप से, जब आप ऐसा करने का प्रयास करते हैं, तो ऑपरेशन निरस्त कर दिया जाएगा और SQLite एक त्रुटि लौटाएगा।
लेकिन आप ON CONFLICT
. का उपयोग कर सकते हैं SQLite इन स्थितियों से निपटने के तरीके को बदलने के लिए क्लॉज।
एक विकल्प यह है कि इस खंड का उपयोग CREATE TABLE
. में किया जाए तालिका बनाते समय कथन। ऐसा करने से यह निर्धारित होगा कि कैसे सभी INSERT
ऑपरेशन का इलाज किया जाता है।
एक अन्य विकल्प INSERT
. पर क्लॉज का उपयोग करना है जब भी आप तालिका में डेटा डालने का प्रयास करते हैं तो कथन। यह आपको तब भी क्लॉज का लाभ उठाने की अनुमति देता है, जब इसके साथ तालिका नहीं बनाई गई थी। जब आप इस विकल्प का उपयोग करते हैं, तो सिंटैक्स अलग होता है; आप OR
का उपयोग करते हैं ON CONFLICT
. के बजाय ।
इस पृष्ठ के उदाहरण दूसरे विकल्प का उपयोग करते हैं - मैं बिना तालिका बनाता हूं ON CONFLICT
खंड, और मैं इसके बजाय निर्दिष्ट करता हूं OR
INSERT
. पर बयान।
नमूना तालिका
आइए एक साधारण तालिका बनाएं और एक पंक्ति जोड़ें।
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName,
Price
);
INSERT INTO Products VALUES (1, 'Hammer', 8.00);
SELECT * FROM Products;
परिणाम:
ProductId ProductName Price ---------- ----------- ---------- 1 Hammer 8.0
वर्तमान में हमारे पास ProductId . के साथ एक पंक्ति है का 1 ।
अब हम उस तालिका में डेटा डालने के विभिन्न परिदृश्यों के माध्यम से चल सकते हैं जो प्राथमिक कुंजी बाधा का उल्लंघन करती है।
उदाहरण 1 - निरस्त करें (डिफ़ॉल्ट व्यवहार)
जैसा कि बताया गया है, SQLite के लिए डिफ़ॉल्ट व्यवहार INSERT
. को निरस्त करना है ऑपरेशन और एक त्रुटि लौटाएं।
INSERT INTO Products VALUES (1, 'Wrench', 12.50);
परिणाम:
Error: UNIQUE constraint failed: Products.ProductId
एक त्रुटि लौटा दी गई थी और कुछ भी नहीं डाला गया था।
यह OR ABORT
. का उपयोग करने के बराबर है विकल्प।
INSERT OR ABORT INTO Products VALUES (1, 'Wrench', 12.50);
परिणाम:
Error: UNIQUE constraint failed: Products.ProductId
हम यह सत्यापित कर सकते हैं कि SELECT
. चलाकर कुछ भी नहीं डाला गया था टेबल के खिलाफ बयान।
SELECT * FROM Products;
परिणाम:
ProductId ProductName Price ---------- ----------- ---------- 1 Hammer 8.0
हम देख सकते हैं कि तालिका में केवल मूल पंक्ति है।
उदाहरण 2 - अनदेखा करें
एक विकल्प यह है कि SQLite आपत्तिजनक पंक्ति को अनदेखा कर दे। दूसरे शब्दों में, यह पंक्ति को छोड़ देगा और बाद की पंक्तियों को संसाधित करना जारी रखेगा।
अपने INSERT
. में ऐसा करने के लिए कथन, OR IGNORE
. का उपयोग करें ।
इसका असर यह होता है कि INSERT
ऑपरेशन सफल होता है, लेकिन बिना किसी पंक्ति के जो प्राथमिक कुंजी बाधा का उल्लंघन करती है।
INSERT OR IGNORE INTO Products VALUES
(1, 'Hammer', 12.00),
(2, 'Nails', 2.50),
(3, 'Saw', 10.50),
(1, 'Wrench', 22.50),
(5, 'Chisel', 23.00),
(6, 'Bandage', 120.00);
SELECT * FROM Products;
परिणाम:
ProductId ProductName Price ---------- ----------- ---------- 1 Hammer 8.0 2 Nails 2.5 3 Saw 10.5 5 Chisel 23.0 6 Bandage 120.0
इस मामले में मैंने दो नई पंक्तियों को एक आईडी के साथ सम्मिलित करने का प्रयास किया जो पहले से ही तालिका में मौजूद थी, इसलिए उन दोनों पंक्तियों को छोड़ दिया गया था।
उदाहरण 3 - बदलें
आपके पास एक अन्य विकल्प मूल पंक्ति को नई पंक्ति से बदलना है।
दूसरे शब्दों में, आप अपने नए डेटा के साथ मौजूदा डेटा को अधिलेखित कर देंगे।
ऐसा करने के लिए, OR REPLACE
use का उपयोग करें ।
INSERT OR REPLACE INTO Products VALUES
(1, 'Hammer', 12.00),
(2, 'Nails', 2.50),
(3, 'Saw', 10.50),
(1, 'Wrench', 22.50),
(5, 'Chisel', 23.00),
(6, 'Bandage', 120.00);
SELECT * FROM Products;
परिणाम:
ProductId ProductName Price ---------- ----------- ---------- 1 Wrench 22.5 2 Nails 2.5 3 Saw 10.5 5 Chisel 23.0 6 Bandage 120.0
इस मामले में अधिकांश पंक्तियाँ समान थीं, इसलिए उनमें INSERT
. के बाद समान डेटा होता है कार्यवाही। हालांकि, हम देख सकते हैं कि पहली पंक्ति को मेरे INSERT
. में मानों का उपयोग करने के लिए अपडेट किया गया है बयान।
हम यह भी देख सकते हैं कि इसने मूल्यों के दूसरे सेट का उपयोग किया (यह देखते हुए कि दो समान ProductId साझा करते हैं) )।
तो प्रभाव एक तरह से UPDATE
जैसा है स्टेटमेंट और INSERT
बयान संयुक्त।
उदाहरण 4 - रोलबैक
दूसरा विकल्प ROLLBACK
. का उपयोग करना है विकल्प।
यह वर्तमान SQL कथन को SQLITE_CONSTRAINT त्रुटि के साथ निरस्त करता है और वर्तमान लेनदेन को वापस रोल करता है। यदि कोई लेन-देन सक्रिय नहीं है (प्रत्येक आदेश पर बनाए गए निहित लेनदेन के अलावा) तो यह ABORT
के समान कार्य करता है एल्गोरिथम।
यह ध्यान देने योग्य है कि यह विकल्प कैसे काम करता है। यहां एक उदाहरण दिया गया है जो कई INSERT OR ROLLBACK
का उपयोग करता है लेन-देन के भीतर बयान।
DELETE FROM Products;
BEGIN TRANSACTION;
INSERT OR ROLLBACK INTO Products VALUES (1, 'Hammer', 8.00);
INSERT OR ROLLBACK INTO Products VALUES (2, 'Nails', 2.50);
INSERT OR ROLLBACK INTO Products VALUES (3, 'Saw', 10.50);
INSERT OR ROLLBACK INTO Products VALUES (1, 'Wrench', 22.50);
INSERT OR ROLLBACK INTO Products VALUES (5, 'Chisel', 23.00);
INSERT OR ROLLBACK INTO Products VALUES (6, 'Bandage', 120.00);
COMMIT;
SELECT * FROM Products;
जब मैं इसे चलाता हूं तो मेरे टर्मिनल से पूरा आउटपुट होता है:
sqlite> BEGIN TRANSACTION; sqlite> INSERT OR ROLLBACK INTO Products VALUES (1, 'Hammer', 8.00); sqlite> INSERT OR ROLLBACK INTO Products VALUES (2, 'Nails', 2.50); sqlite> INSERT OR ROLLBACK INTO Products VALUES (3, 'Saw', 10.50); sqlite> INSERT OR ROLLBACK INTO Products VALUES (1, 'Wrench', 22.50); Error: UNIQUE constraint failed: Products.ProductId sqlite> INSERT OR ROLLBACK INTO Products VALUES (5, 'Chisel', 23.00); sqlite> INSERT OR ROLLBACK INTO Products VALUES (6, 'Bandage', 120.00); sqlite> COMMIT; Error: cannot commit - no transaction is active sqlite> sqlite> SELECT * FROM Products; ProductId ProductName Price ---------- ----------- ---------- 5 Chisel 23.0 6 Bandage 120.0 sqlite>
मूल रूप से यहां जो हुआ वह यह है कि, यह बाधा उल्लंघन तक पहुंच गया है, फिर लेनदेन को वापस ले लिया है। फिर अगली दो पंक्तियों को संसाधित किया गया और फिर COMMIT
कीवर्ड का सामना करना पड़ा। तब तक, लेन-देन पहले ही वापस ले लिया गया था और इसलिए हमें यह बताते हुए एक और त्रुटि मिली कि कोई लेन-देन सक्रिय नहीं था।
अगर मैं इसे लेन-देन से हटा दूं तो यहां क्या होगा।
DELETE FROM Products;
INSERT OR ROLLBACK INTO Products VALUES (1, 'Hammer', 8.00);
INSERT OR ROLLBACK INTO Products VALUES (2, 'Nails', 2.50);
INSERT OR ROLLBACK INTO Products VALUES (3, 'Saw', 10.50);
INSERT OR ROLLBACK INTO Products VALUES (1, 'Wrench', 22.50);
INSERT OR ROLLBACK INTO Products VALUES (5, 'Chisel', 23.00);
INSERT OR ROLLBACK INTO Products VALUES (6, 'Bandage', 120.00);
SELECT * FROM Products;
जब मैं इसे चलाता हूं तो मेरे टर्मिनल से पूरा आउटपुट होता है:
sqlite> DELETE FROM Products; sqlite> sqlite> INSERT OR ROLLBACK INTO Products VALUES (1, 'Hammer', 8.00); sqlite> INSERT OR ROLLBACK INTO Products VALUES (2, 'Nails', 2.50); sqlite> INSERT OR ROLLBACK INTO Products VALUES (3, 'Saw', 10.50); sqlite> INSERT OR ROLLBACK INTO Products VALUES (1, 'Wrench', 22.50); Error: UNIQUE constraint failed: Products.ProductId sqlite> INSERT OR ROLLBACK INTO Products VALUES (5, 'Chisel', 23.00); sqlite> INSERT OR ROLLBACK INTO Products VALUES (6, 'Bandage', 120.00); sqlite> sqlite> SELECT * FROM Products; ProductId ProductName Price ---------- ----------- ---------- 1 Hammer 8.0 2 Nails 2.5 3 Saw 10.5 5 Chisel 23.0 6 Bandage 120.0 sqlite>
इस मामले में, यह ABORT
. की तरह काम करता है ।
इसे प्रदर्शित करने के लिए, ABORT
. का उपयोग करके यहां वही कथन दिया गया है ROLLBACK
. के बजाय ।
DELETE FROM Products;
INSERT OR ABORT INTO Products VALUES (1, 'Hammer', 8.00);
INSERT OR ABORT INTO Products VALUES (2, 'Nails', 2.50);
INSERT OR ABORT INTO Products VALUES (3, 'Saw', 10.50);
INSERT OR ABORT INTO Products VALUES (1, 'Wrench', 22.50);
INSERT OR ABORT INTO Products VALUES (5, 'Chisel', 23.00);
INSERT OR ABORT INTO Products VALUES (6, 'Bandage', 120.00);
SELECT * FROM Products;
जब मैं इसे चलाता हूं तो मेरे टर्मिनल से पूरा आउटपुट होता है:
sqlite> DELETE FROM Products; sqlite> sqlite> INSERT OR ABORT INTO Products VALUES (1, 'Hammer', 8.00); sqlite> INSERT OR ABORT INTO Products VALUES (2, 'Nails', 2.50); sqlite> INSERT OR ABORT INTO Products VALUES (3, 'Saw', 10.50); sqlite> INSERT OR ABORT INTO Products VALUES (1, 'Wrench', 22.50); Error: UNIQUE constraint failed: Products.ProductId sqlite> INSERT OR ABORT INTO Products VALUES (5, 'Chisel', 23.00); sqlite> INSERT OR ABORT INTO Products VALUES (6, 'Bandage', 120.00); sqlite> sqlite> SELECT * FROM Products; ProductId ProductName Price ---------- ----------- ---------- 1 Hammer 8.0 2 Nails 2.5 3 Saw 10.5 5 Chisel 23.0 6 Bandage 120.0 sqlite>
असफल विकल्प
FAIL
विकल्प SQLITE_CONSTRAINT त्रुटि के साथ वर्तमान SQL कथन को निरस्त करता है। लेकिन यह विकल्प SQL कथन के पूर्व परिवर्तनों को वापस नहीं करता है जो विफल हो गया और न ही यह लेनदेन को समाप्त करता है।
DELETE FROM Products;
INSERT OR FAIL INTO Products VALUES
(1, 'Hammer', 8.00),
(2, 'Nails', 2.50),
(3, 'Saw', 10.50),
(1, 'Wrench', 22.50),
(5, 'Chisel', 23.00),
(6, 'Bandage', 120.00);
SELECT * FROM Products;
परिणाम:
ProductId ProductName Price ---------- ----------- ---------- 1 Hammer 8.0 2 Nails 2.5 3 Saw 10.5