SQLite में ऑटो-इन्क्रीमेंट कॉलम को संभालने का एक दिलचस्प तरीका है। ऑटो-इन्क्रीमेंटिंग कॉलम से मेरा मतलब उन कॉलम से है जो जब भी नया डेटा डाला जाता है तो स्वचालित रूप से बढ़ता है।
यह एक IDENTITY
के समान है SQL सर्वर में कॉलम या AUTO_INCREMENT
MySQL
में कॉलम ।
यह लेख बताता है कि AUTOINCREMENT
कैसे बनाया जाता है SQLite में कॉलम।
स्वचालित रूप से एक ऑटो-इन्क्रीमेंट कॉलम बनाएं
डिफ़ॉल्ट रूप से, जब आप किसी कॉलम को INTEGER PRIMARY KEY
. के रूप में परिभाषित करते हैं , जब भी आप उस कॉलम में NULL डालेंगे तो यह स्वतः बढ़ जाएगा।
उदाहरण:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
इस तालिका में, CatId कॉलम एक ऑटोइनक्रिकमेंट कॉलम है। ऐसा इसलिए है क्योंकि इसे INTEGER PRIMARY KEY
. का उपयोग करके परिभाषित किया गया है ।
अब, जब मैं उस कॉलम में NULL सम्मिलित करता हूँ, CatId कॉलम ऑटो-इन्क्रीमेंट:
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
SELECT * FROM Cats;
परिणाम:
CatId CatName ---------- ---------- 1 Brush 2 Scarcat 3 Flutter
यह ध्यान रखना महत्वपूर्ण है कि आप AUTOINCREMENT
को ओवरराइड कर सकते हैं अपना खुद का मूल्य डालने से मूल्य। दूसरे शब्दों में, AUTOINCREMENT
यदि आप नहीं करते हैं तो केवल एक मान सम्मिलित करता है।
जिस तरह से यह काम करता है, वह है NULL
स्वचालित रूप से एक पूर्णांक में परिवर्तित हो जाता है जो तालिका में अन्य सभी पंक्तियों पर उस कॉलम के सबसे बड़े मान से एक बड़ा होता है। यदि तालिका खाली है, तो मान 1
होगा ।
यदि कॉलम का सबसे बड़ा मान सबसे बड़ा संभावित पूर्णांक (9223372036854775807) है, तो SQLite यादृच्छिक रूप से एक अप्रयुक्त कुंजी का चयन करेगा। इसका आमतौर पर मतलब है कि यह पुरानी कुंजियों का पुन:उपयोग करेगा जिन्हें पहले हटा दिया गया था। यदि कोई अप्रयुक्त कुंजी नहीं मिल पाती है, तो INSERT
ऑपरेशन एक SQLITE_FULL
के साथ विफल हो जाता है त्रुटि।
मूल रूप से इसका मतलब यह है कि यदि आप DELETE
. की अनुमति देते हैं तालिका में संचालन, तो इस बात की कोई गारंटी नहीं है कि सभी पंक्तियाँ क्रम में होंगी। इस बात की संभावना है कि कुछ पंक्तियों का मान बाद की तारीख में डाली गई पंक्तियों से अधिक होगा।
इसलिए, ऐसे मामलों में, यदि आपको पंक्तियों को सम्मिलित करने के क्रम के आधार पर तालिका को आरोही या अवरोही क्रम में क्रमबद्ध करने की आवश्यकता है, तो आप इस कॉलम पर भरोसा नहीं कर सकते।
सौभाग्य से, यदि यह आपके लिए एक समस्या है, तो इसका एक समाधान है:AUTOINCREMENT
कीवर्ड।
स्वचालित कीवर्ड का उपयोग करें
वैकल्पिक रूप से, आप AUTOINCREMENT
का उपयोग करके कॉलम को स्वतः-वृद्धि पर स्पष्ट रूप से सेट करना चुन सकते हैं कीवर्ड।
इस पद्धति का उपयोग करने का एक लाभ यह है कि यह गारंटी देता है कि सभी पंक्तियाँ आरोही क्रम में होंगी। ऐसा इसलिए है क्योंकि यह पहले से हटाई गई कुंजियों का पुन:उपयोग नहीं करता है। प्रत्येक कुंजी हमेशा उस तालिका में मौजूद सबसे बड़ी कुंजी से एक अधिक होगी। यदि उस तालिका में पहले से सबसे बड़ी संभावित कुंजी मौजूद है, तो यह नहीं पहले हटाई गई कुंजियों का उपयोग करने का प्रयास करें। INSERT
SQLITE_FULL
के साथ विफल हो जाएगा त्रुटि कोड।
AUTOINCREMENT
. का उपयोग करने का नकारात्मक पक्ष कीवर्ड यह है कि यह अतिरिक्त CPU, मेमोरी, डिस्क स्थान और डिस्क I/O ओवरहेड का उपयोग करता है।
यहां AUTOINCREMENT
के साथ ऑटो-इंक्रीमेंटिंग कॉलम बनाने का एक उदाहरण दिया गया है कीवर्ड:
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY AUTOINCREMENT,
DogName
);
अब डेटा डालें और उसे चुनें:
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' ),
( NULL, 'Fluff' );
SELECT * FROM Dogs;
परिणाम:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer 3 Fluff
अगर मुझे फुलाना को हटाना होता इस तालिका से, फिर एक नई पंक्ति डालें (NULL
. का उपयोग करके) डॉगआईड के रूप में), नया डॉगआईड 4 होगा। दूसरे शब्दों में, यह 3 का पुन:उपयोग नहीं करेगा।
अगर कॉलम बिना बनाया गया होता AUTOINCREMENT
कीवर्ड, फिर अगली पंक्ति 3 के DogId का पुन:उपयोग करेगी।
अगर मैं 9223372036854775807 (सबसे बड़ा संभावित पूर्णांक) का डॉगआईड सम्मिलित करता, तो मुझे अगले इंसर्ट पर निम्न त्रुटि प्राप्त होती जो निर्दिष्ट करती है NULL
उस कॉलम के लिए:
Error: database or disk is full
हालाँकि, मैं स्पष्ट रूप से एक मान सम्मिलित कर सकता हूँ जो 9223372036854775807 से कम है, जब तक कि वह मान पहले से ही किसी अन्य पंक्ति द्वारा उपयोग नहीं किया जा रहा है, और INSERT
उपरोक्त त्रुटि के बिना ऑपरेशन सफल होना चाहिए।
मूल रूप से, एक बार जब आप 9223372036854775807 पर पहुंच जाते हैं, तो ऑटो-इन्क्रीमेंट काम नहीं करेगा।
AUTOINCREMENT
. के बिना परिभाषित कॉलम कीवर्ड में यह समस्या नहीं है। वे स्वचालित रूप से वापस जाएंगे और इसके बजाय उपयोग करने के लिए एक अप्रयुक्त पूर्णांक खोजने का प्रयास करेंगे। हालाँकि, यदि सभी पूर्णांकों का उपयोग किया गया है (अर्थात तालिका में वास्तव में 9223372036854775807 पंक्तियाँ हैं), तो उन स्तंभों के परिणामस्वरूप भी उपरोक्त त्रुटि होगी।