रिटर्निंग क्लॉज
आप आधिकारिक दस्तावेज़ यहाँ पढ़ सकते हैं।
कई बार हम अपने डेटाबेस में रिकॉर्ड डालने के बाद खुद को कुछ डेटा (शायद आईडी) वापस करना चाहते हैं। संस्करण के बाद से 3.35.0
(2021-03-12), SQLite RETURNING
का समर्थन करता है क्लॉज, जो आपको DELETE
द्वारा प्रत्येक संशोधित डेटाबेस पंक्ति के लिए परिणाम पंक्ति (या विशिष्ट कॉलम) लौटाने की अनुमति देता है , UPDATE
या INSERT
बयान।
INSERT INTO customers (fullName, birthdateTimestamp, address)
VALUES ('Andrew Mitch', 643911868, '206 Grange Road, Gillingham')
RETURNING *;
उपरोक्त क्वेरी, निष्पादन के बाद, हमें id
. के साथ डेटाबेस में डाले गए प्रत्येक मान को वापस कर देगी प्रत्येक पंक्ति का। इस तरह हम एक और SELECT
बनाने से बच सकते हैं डेटाबेस के लिए क्वेरी। बहुत साफ-सुथरा, है ना?
यूपीएसईआरटी क्लॉज
आप आधिकारिक दस्तावेज़ यहाँ पढ़ सकते हैं।
एक और अच्छी छोटी विशेषता है UPSERT
खंड। यह संस्करण 3.24.0
. में जोड़ा गया था (2018-06-04) और यह INSERT
. का कारण बनता है UPDATE
की तरह व्यवहार करने के लिए या एक no-op
, UNIQUE CONSTRAINT
. के मामले में या एक PRIMARY KEY CONSTRAINT
उल्लंघन।
विस्तृत करने के लिए, मान लें कि आपके पास एक action_records
है तालिका जो users
. में उपयोगकर्ताओं द्वारा सक्रिय सभी कार्रवाइयों को रखती है तालिका, किसी विशिष्ट सत्र के लिए . जब कोई नई क्रिया सक्रिय की जाती है तो आप या तो एक नया action_record
सम्मिलित करना चाहते हैं बिना किसी त्रुटि के, या, यदि मौजूदा और समान सत्र टाइमस्टैम्प है (यह ON CONFLICT
. द्वारा नियंत्रित किया जाता है क्लॉज), पुराने को अपडेट करें। आप वैकल्पिक रूप से WHERE
. भी जोड़ सकते हैं बयान जिसके परिणामस्वरूप no-op
होगा , अगर नहीं मिले। नीचे दी गई क्वेरी को यह करना चाहिए:
-- Create users table and assign userID and sessionStartTimestamp as a UNIQUE CONSTRAINT.
DROP TABLE IF EXISTS "action_records";
CREATE TABLE IF NOT EXISTS "action_records" (
"id" INTEGER NOT NULL,
"userID" INTEGER NOT NULL,
"sessionStartTimestamp" INTEGER NOT NULL,
"errorMsg" TEXT,
PRIMARY KEY("id" AUTOINCREMENT),
FOREIGN KEY("userID") REFERENCES "users"("id") ON DELETE CASCADE,
UNIQUE(userID, sessionStartTimestamp)
);
-- Insert new record or update the old one based on UNIQUE_CONSTRAINT OF userID & session_start_timestamp
INSERT INTO action_records (userID, errorMsg, sessionStartTimestamp)
VALUES (258, null, 643911868)
ON CONFLICT(userID, sessionStartTimestamp) -- Conflict when a record for the same user and session exists
DO UPDATE SET errorMsg = 'An error occured'
WHERE errorMsg IS NOT NULL -- This will be a no-op in case there is already an error and you don't want to update it
RETURNING *; -- Optionally adding RETURNING to retrieve any number of columns we want
UPSERT और RETURNING संयुक्त
एक बात जो मुझे बहुत अच्छी लगी वह यह है कि आप केवल RETURNING *
जोड़कर उन खंडों को जोड़ सकते हैं क्वेरी के अंत में। इस तरह कोई भी पंक्ति (या निर्दिष्ट कॉलम), या तो डाली गई या अपडेट की गई, लौटा दी जाएगी।