क्या साइक्लाइट में ऑटो इन्क्रीमेंट है?


109

मैं Sqlite3primary key में एक ऑटो-इंक्रीमेंट के साथ एक तालिका बनाने की कोशिश कर रहा हूं । मुझे यकीन नहीं है कि यह वास्तव में संभव है, लेकिन मैं केवल अन्य क्षेत्रों को नामित करने की उम्मीद कर रहा हूं।

उदाहरण के लिए:

CREATE TABLE people (id integer primary key auto increment, first_name varchar(20), last_name varchar(20));

फिर, जब मैं एक मूल्य जोड़ता हूं, तो मुझे उम्मीद थी कि केवल करना होगा:

INSERT INTO people
VALUES ("John", "Smith");

क्या यह भी संभव है?

मैं चला रहा हूँ sqlite3के तहत cygwinविंडोज 7 में।

जवाबों:


167

आपको एक मुफ्त में मिलता है, जिसे ROWID कहा जाता है। यह प्रत्येक SQLite तालिका में है, चाहे आप इसके लिए पूछें या नहीं।

यदि आप INTEGER PRIMARY KEY के एक प्रकार का कॉलम शामिल करते हैं, तो वह कॉलम स्वचालित ROWID कॉलम में (के लिए एक अन्य नाम) है।

ROWID (जब भी आप इसे जिस नाम से भी पुकारते हैं) एक मूल्य निर्दिष्ट किया जाता है जब भी आप एक पंक्ति को सम्मिलित करते हैं, जैसा कि आप अपेक्षा करते हैं। यदि आप INSERT पर स्पष्ट रूप से एक गैर-पूर्ण मान असाइन करते हैं, तो यह स्वतः-वृद्धि के बजाय उस निर्दिष्ट मान को प्राप्त करेगा। यदि आप INSERT पर स्पष्ट रूप से NULL का मान असाइन करते हैं, तो उसे अगला ऑटो-इंक्रीमेंट मान प्राप्त होगा।

इसके अलावा, आपको बचने की कोशिश करनी चाहिए:

 INSERT INTO people VALUES ("John", "Smith");

और उपयोग करें

 INSERT INTO people (first_name, last_name) VALUES ("John", "Smith");

बजाय। पहला संस्करण बहुत नाजुक है - यदि आप कभी भी अपनी तालिका में कॉलम जोड़ते हैं, स्थानांतरित करते हैं, या हटाते हैं, तो INSERT या तो गलत डेटा या गलत डेटा (गलत कॉलम में मानों के साथ) उत्पन्न करेगा।


53
ROWID काफी हद तक एक सच्चे स्वायत्तता के समान नहीं है क्योंकि SAME मूल्य एक से अधिक बार उत्पन्न हो सकता है। उदाहरण के लिए, एक खाली तालिका के साथ, 3 पंक्तियों को सम्मिलित करने से तीसरी पंक्ति को उम्मीद के मुताबिक 3 की एक पंक्ति मिलती है। हालाँकि, 2 पंक्तियाँ सम्मिलित करें, अंतिम को हटाएं और दूसरी डालें, तीसरी सम्मिलित पंक्ति को 2 की ROWID देता है, ठीक उसी तरह जैसे 2 पंक्ति में थी। इसलिए एक स्पष्ट गंभीर समस्या है यदि टेबल एक तालिका में ROWIDs को संदर्भित करती है जहां हटाए जाते हैं और जहां हटाए गए या ROWID नल को संबंधित तालिकाओं में भी नहीं किया जाता है।
निक

10
यदि यह उत्तर से स्पष्ट नहीं है, तो आप अपने चुनिंदा बयान में ROWID का उपयोग कर सकते हैं जैसेselect rowid from people;
कॉलिन डी

@ बस अपने विचार के पूरक के लिए: इसलिए ऑटो-वेतन वृद्धि एक सुरक्षा उपाय है। और हम ROWID में दो पंक्तियों के टकराने की बात नहीं कर रहे हैं।
यूसुफफिर

68

हां, यह संभव है। SQLite FAQ के अनुसार :

एक कॉलम घोषित किया INTEGER PRIMARY KEYजाएगा।


12
यूकेयू द्वारा उल्लिखित और दस्तावेज में भी बताया गया है, कि आपको इस काम के लिए ID के लिए NULL में पास होना होगा।
मैट हल्क

22
यदि आप स्तंभों की सूची INSERT पर छोड़ते हैं तो आपको केवल NULL का उपयोग करने की आवश्यकता है - कभी भी अच्छा अभ्यास नहीं। यदि आप कॉलम निर्दिष्ट करते हैं, तो आप बस ऑटो-इंक्रीमेंट कॉलम छोड़ सकते हैं और इसे अगला मान प्राप्त होगा।
लैरी लुस्टिग

5
एक और कैविएट: "इंटेगर ..." लिखें जैसा कि ऊपर दिया गया है। एक शॉर्टहैंड "INT ..." काम नहीं करेगा।
मार्सिन वोज्नार्स्की

26

आज तक - जून २०१ 201


इस विषय पर आधिकारिक SQLite प्रलेखन का क्या कहना है (बोल्ड और इटैलिक मेरे हैं):

  1. AutoIncrement कीवर्ड लगाता अतिरिक्त सीपीयू, स्मृति, डिस्क स्थान, और डिस्क मैं / हे भूमि के ऊपर और अगर सख्ती से की जरूरत नहीं बचा जाना चाहिए। आमतौर पर इसकी जरूरत नहीं होती।

  2. SQLite में, INTEGER PRIMARY KEY वाला एक कॉलम ROWID (बिना ROWID टेबल के) के लिए एक उपनाम है जो हमेशा 64-बिट हस्ताक्षरित पूर्णांक होता है।

  3. एक INSERT पर, अगर ROWID या INTEGER PRIMARY KEY कॉलम को स्पष्ट रूप से मान नहीं दिया जाता है, तो यह अप्रयुक्त पूर्णांक के साथ स्वचालित रूप से भर जाएगा , आमतौर पर वर्तमान में उपयोग किए जाने वाले सबसे बड़े ROWID में से एक यह सच है कि AUTOINCREMENT कीवर्ड का उपयोग किया गया है या नहीं।

  4. यदि INTEGER प्राथमिक कुंजी के बाद AUTOINCREMENT कीवर्ड प्रकट होता है , जो डेटाबेस के जीवनकाल में ROWID के पुन: उपयोग को रोकने के लिए स्वचालित ROWID असाइनमेंट एल्गोरिथ्म को बदल देता है। दूसरे शब्दों में, AUTOINCREMENT का उद्देश्य पूर्व में हटाए गए पंक्तियों से ROWIDs के पुन: उपयोग को रोकना है।


11

क्या आपने इसे पढ़ा है? मैं एक AUTOINCREMENT फ़ील्ड कैसे बनाऊँ।

INSERT INTO people
VALUES (NULL, "John", "Smith");

तो आप जो कह रहे हैं, वह यह है कि जो मैं करने की कोशिश कर रहा हूं वह संभव नहीं है, लेकिन मैं एक तरह का अनुकरण कर सकता हूं। मुझे डालने में एक अशक्त का उपयोग करने की आवश्यकता है?
ईवोक

1
आपको कुछ भी करने की आवश्यकता नहीं है, लेकिन हमेशा NULL को आईडी के रूप में सम्मिलित करना चाहिए, यह सिर्फ यह बताता है कि कैसे आंतरिक रूप से sqlite करता है।
उकु लोसकिट

7
INSERT पर NULL की केवल आवश्यकता होती है यदि आप INSERT को कॉलम की सूची निर्दिष्ट नहीं करते हैं (जिस स्थिति में, आपको स्तंभों की संख्या से बिल्कुल मेल खाने वाले मानों की आवश्यकता है और NULL को प्लेसहोल्डर के रूप में उपयोग करना होगा)। लेकिन कॉलम की सूची को निर्दिष्ट किए बिना एक INSERT करना कभी भी अच्छा अभ्यास नहीं है। यदि आप स्तंभों की सूची निर्दिष्ट करते हैं, तो बस ऑटोनक्रिममेंट कॉलम और NULL मान दोनों को छोड़ दें, और आपको वह परिणाम मिलेगा जिसकी आप अपेक्षा करते हैं।
लैरी लुस्टिग

4

AUTOINCREMENTपास वाले को कीवर्ड निर्दिष्ट नहीं करना चाहिए PRIMARY KEY। स्वत: संचय प्राथमिक कुंजी बनाने और डालने का उदाहरण:

$ sqlite3 ex1

CREATE TABLE IF NOT EXISTS room(room_id INTEGER PRIMARY KEY, name VARCHAR(25) NOT NULL, home_id VARCHAR(25) NOT NULL);

INSERT INTO room(name, home_id) VALUES ('test', 'home id test');

INSERT INTO room(name, home_id) VALUES ('test 2', 'home id test 2');

SELECT * FROM room;

दे देंगे:

1|test|home id test
2|test 2|home id test 2

4

बगल में, आप अपने स्वयं के ऑटो वेतन वृद्धि क्षेत्र को परिभाषित कर सकते हैं लेकिन यह अनुशंसित नहीं है। यह हमेशा बेहतर समाधान होता है जब हम स्वचालित रूप से वृद्धि हुई पंक्ति का उपयोग करते हैं।

AUTOINCREMENTकीवर्ड लगाता अतिरिक्त सीपीयू, स्मृति, डिस्क स्थान, और डिस्क मैं / हे भूमि के ऊपर और अगर सख्ती से की जरूरत नहीं बचा जाना चाहिए। आमतौर पर इसकी जरूरत नहीं होती।

विस्तृत जानकारी के लिए यहां पढ़ें ।


जाहिरा तौर पर उपद्रवी हमेशा स्वचालित रूप से नहीं बढ़े हैं, निक द्वारा टिप्पणी देखें
rogerdpack

1
सच नहीं। कुछ मामलों में ऑटो इंक्रीमेंट बेहतर है, क्योंकि यह आईडी का पुन: उपयोग नहीं करेगा - कई प्रणालियों के लिए एक बहुत महत्वपूर्ण आवश्यकता।
ओ'रोनी

3

SQLite AUTOINCREMENT एक खोजशब्द है जिसका उपयोग तालिका में किसी क्षेत्र के मान को बढ़ाने के लिए किया जाता है। जब हम ऑटो कॉलम बढ़ाते हैं तो विशिष्ट कॉलम नाम वाली एक तालिका बनाते समय AUTOINCREMENT कीवर्ड का उपयोग करके हम फ़ील्ड मान को बढ़ा सकते हैं।

कीवर्ड AUTOINCREMENT का उपयोग केवल INTEGER फ़ील्ड के साथ किया जा सकता है। वाक्य - विन्यास:

AUTOINCREMENT कीवर्ड का मूल उपयोग इस प्रकार है:

CREATE TABLE table_name(
   column1 INTEGER AUTOINCREMENT,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
);

उदाहरण के लिए नीचे देखें: निम्नानुसार बनाई गई कंपनी तालिका पर विचार करें:

sqlite> CREATE TABLE TB_COMPANY_INFO(
   ID INTEGER PRIMARY KEY   AUTOINCREMENT,
   NAME           TEXT      NOT NULL,
   AGE            INT       NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

अब, निम्न रिकॉर्ड को तालिका में दर्ज करें TB_COMPANY_INFO:

INSERT INTO TB_COMPANY_INFO (NAME,AGE,ADDRESS,SALARY)
VALUES ( 'MANOJ KUMAR', 40, 'Meerut,UP,INDIA', 200000.00 );

अब रिकॉर्ड का चयन करें

SELECT *FROM TB_COMPANY_INFO
ID      NAME            AGE     ADDRESS             SALARY
1       Manoj Kumar     40      Meerut,UP,INDIA     200000.00

2

मुझे पता है कि यह उत्तर थोड़ा देर से है।
इस उत्तर के लिए मेरा उद्देश्य सभी के संदर्भ के लिए है कि क्या उन्हें इस तरह की चुनौती का सामना अभी और भविष्य में SQLite के साथ करना चाहिए।

अब, आपकी क्वेरी को वापस देखते हुए, यह कुछ इस तरह होना चाहिए।

CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20));

यह मेरे अंत पर काम करता है। इस तरह,

यहां छवि विवरण दर्ज करें

यदि आप SQLite के साथ काम कर रहे हैं, तो मैं आपको SQLite के लिए DB ब्राउज़र की जाँच करने का सुझाव देता हूँ । विभिन्न प्लेटफार्मों पर भी काम करता है।


0

आप जो करते हैं वह सही है, लेकिन 'ऑटो इन्क्रीमेंट' के लिए सही सिंटैक्स बिना जगह के होना चाहिए:

CREATE TABLE people (id integer primary key autoincrement, first_name string, last_name string);

(कृपया यह भी ध्यान दें कि मैंने आपके varchars को स्ट्रिंग्स में बदल दिया है। ऐसा इसलिए है क्योंकि SQLite आंतरिक रूप से एक varchar को स्ट्रिंग में बदल देती है, इसलिए परेशान क्यों होती है?)

फिर आपकी प्रविष्टि, SQL भाषा में यथासंभव मानक होनी चाहिए:

INSERT INTO people(id, first_name, last_name) VALUES (null, 'john', 'doe');

हालांकि यह सच है कि यदि आप आईडी को छोड़ देते हैं तो यह स्वचालित रूप से बढ़ जाएगा और सौंपा जाएगा, मैं व्यक्तिगत रूप से स्वचालित तंत्र पर भरोसा नहीं करना चाहता हूं जो भविष्य में बदल सकता है।

ऑटोइन्क्रिमेंट पर एक नोट: हालांकि, जैसा कि कई बताया गया है, यह SQLite लोगों द्वारा अनुशंसित नहीं है, मुझे हटाए गए रिकॉर्ड के आईडी का स्वत: पुन: उपयोग पसंद नहीं है यदि ऑटोइनक्रिममेंट का उपयोग नहीं किया गया है। दूसरे शब्दों में, मुझे यह पसंद है कि हटाए गए रिकॉर्ड की आईडी कभी नहीं, कभी भी फिर से दिखाई देगी।

HTH


इस संबंध में मैं ओ'रोनी का कहना है कि मैं पूरी तरह से साझा करता हूं।
लुका नानेटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.