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

SQLite UPSERT और नए रिटर्निंग क्लॉज के बारे में त्वरित पोस्ट।

रिटर्निंग क्लॉज

आप आधिकारिक दस्तावेज़ यहाँ पढ़ सकते हैं।

कई बार हम अपने डेटाबेस में रिकॉर्ड डालने के बाद खुद को कुछ डेटा (शायद आईडी) वापस करना चाहते हैं। संस्करण के बाद से 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 * जोड़कर उन खंडों को जोड़ सकते हैं क्वेरी के अंत में। इस तरह कोई भी पंक्ति (या निर्दिष्ट कॉलम), या तो डाली गई या अपडेट की गई, लौटा दी जाएगी।


  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. ListView सही छवियों को नहीं दिखाता है जो कि sqlite में उनके नाम के अनुसार आकर्षित करने योग्य हैं

  3. SQLite डेटाबेस का बैकअप लें

  4. किसी विदेशी कुंजी के साथ या उसके बिना संदर्भों में क्या अंतर है

  5. एंड्रॉइड:पैरेंट टेबल स्क्लाइट के साथ चाइल्ड टेबल में कैसे शामिल हों?