2010-06-08 8 views
5

मुझे विकास के दौरान डेटाबेस समाधान के रूप में SQLite का उपयोग करने की संभावना के बारे में मनोनीत किया गया था ताकि मैं एनएचबीर्नेट की शेमाएक्सपोर्ट कार्यक्षमता का उपयोग करके रनटाइम पर डीबी उत्पन्न करने और गतिशील रूप से डीबी उत्पन्न करने पर ध्यान केंद्रित कर सकूं। हालांकि, मैं कुछ मुद्दों में भाग रहा हूं, जिनमें से कम से कम ऐसा नहीं लगता है कि SQLite मुझे मेरी प्राथमिक कुंजी (बनाम, कहें, Int32 या Guid) के लिए Int64 का उपयोग करने की आवश्यकता है। क्या इसके आसपास कोई रास्ता है?क्या मैं SQLite में प्राथमिक कुंजी डेटा प्रकार के रूप में BIGINT के अलावा कुछ भी उपयोग कर सकता हूं?

नोट: मुझे यह निर्दिष्ट करना चाहिए कि यह एनएचबीरनेट का उपयोग करके ऐप के संदर्भ में है। यह सख्ती से इस मामले को नहीं बोल रहा है कि कोई एक आईएनटी डेटाटाइप के साथ SQLite में कोई टेबल नहीं बना सकता है, लेकिन डेटा को सहेजने और पुनर्प्राप्त करने पर व्यवहार यह इंगित करता है कि इसे इंट 64 के रूप में संग्रहीत और/या पुनर्प्राप्त किया जा रहा है।

उत्तर

6

SQLite आप एक PRIMARY KEY के रूप में अपनी तालिका में कोई फ़ील्ड का उपयोग करने देगा। ऐसा करने से क्षेत्र में UNIQUE इंडेक्स अंतर्निहित होगा। यह वह क्षेत्र है जहां आप डेवलपर के रूप में क्षेत्र के लिए प्राथमिक अद्वितीय पहचानकर्ता मान सकते हैं। यह किसी भी समर्थित SQLite डेटा प्रकार (नीचे) हो सकता है।

SQLite हमेशा प्रत्येक तालिका के लिए एक अंतर्निहित आंतरिक संख्यात्मक पहचानकर्ता बनाएगा। इसमें RowID, OID, और _ROWID_ सहित कई उपनाम होंगे। यदि आप अपनी प्राथमिक कुंजी INTEGER PRIMARY KEY के रूप में बनाते हैं तो यह उसी फ़ील्ड का उपयोग आपकी प्राथमिक कुंजी और SQLite के आंतरिक संख्यात्मक पहचानकर्ता के रूप में करेगा।

SQLite में Int32 या Int64 या Guid डेटा प्रकार की अवधारणा नहीं है। इसमें केवल चार डेटा प्रकार हैं: INT, REAL, TEXT, और BLOB। जब आप SQLite के खिलाफ डीडीएल चलाते हैं तो आप इन चार पहचानकर्ताओं के अलावा किसी भी अन्य चीज़ का उपयोग करते हैं, तो SQLite नियमों का एक सेट उपयोग करेगा कि यह निर्धारित करने के लिए कि किस प्रकार का उपयोग करना है। असल में, Int32 और Int64 को INT के उपनाम के रूप में माना जाता है और यह वही काम करने को समाप्त करता है।

एक बार जब आप प्रत्येक फ़ील्ड के लिए बताए गए डेटा प्रकारों के साथ तालिकाओं को बनाते हैं, तो आप जो भी सेट करते हैं वह उस क्षेत्र के लिए प्रकार का संबंध है। SQLite डेटा प्रकारों को लागू नहीं करता है। घोषित प्रकार के बावजूद किसी भी डेटा को किसी भी क्षेत्र में रखा जा सकता है। SQLite यदि संभव हो तो डेटा को कनवर्ट करने के लिए प्रकार एफ़िनिटी का उपयोग करेगा, इसलिए यदि आप INT फ़ील्ड में टेक्स्ट स्ट्रिंग के रूप में '123' डालते हैं, तो यह इसे 123 नंबर के रूप में संग्रहीत करेगा।

प्रकार एफ़िनिटी का एकमात्र अपवाद INTEGER PRIMARY KEY FIELDS है। वे पूर्णांक होना चाहिए।

SQLite में पूर्णांक हमेशा एक चर लंबाई लंबाई के साथ संग्रहीत होते हैं। तो पूर्णांक के आकार के आधार पर, आप वास्तव में कुछ पंक्तियों के लिए इंट 64 को अन्य लोगों के लिए Int64 प्राप्त कर सकते हैं, सभी एक ही फ़ील्ड के भीतर। यह आपके द्वारा उपयोग किए जा रहे रैपर पर निर्भर करता है, इस मामले में NHibernate (मुझे System.Data.SQLite के साथ लगता है)।

+0

इस पर लूप को बंद करने के लिए, मैंने इसे स्वीकृत उत्तर के रूप में चिह्नित किया है क्योंकि यह पोस्ट के शीर्षक को संबोधित करता है। अब जब मैं और जानता हूं, तो मैं गलत सवाल पूछ रहा था। मुद्दा यह है कि, जब आप SQLite में एक INT डेटाटाइप का उपयोग करते हैं और आप उसे कोड (सी #, वैसे भी) में पुनर्प्राप्त करते हैं, तो यह Int64 के रूप में वापस आता है, इसलिए आपकी गुणों को अमान्यकास्ट अपवाद से बचने के लिए लंबे समय तक घोषित किया जाना चाहिए (या, मुझे लगता है , यदि आप NHIbernate या किसी अन्य ORM का उपयोग कर रहे हैं और स्पष्ट रूप से कास्ट करते हैं तो ऑब्जेक्ट पुनर्प्राप्ति को रोकने के लिए अतिरिक्त कार्य कर सकते हैं)। – sydneyos

0

यह आपको इंटी 64 का उपयोग करने की आवश्यकता नहीं है, हालांकि, यह संभव है कि यह केवल तभी अनुमति देता है जब आप संख्यात्मक प्राथमिक कुंजी निर्दिष्ट करते हैं। चूंकि स्क्लाइट में वास्तव में रेफरेंसियल अखंडता जांच नहीं होती है (हालांकि इस बारे में हालिया चर्चा हुई है और शायद डॉ हिप्प ने भी कार्यान्वित किया है, मैंने हाल ही में जांच नहीं की है), सभी प्राथमिक कुंजी का मतलब है "इस कॉलम को अद्वितीय बनाएं और एक इंडेक्स बनाएं यह "। इसके बारे में बहुत खास नहीं है। आप निश्चित रूप से प्राथमिक कुंजी के लिए वर्चर या टेक्स्ट का उपयोग कर सकते हैं। उदाहरण के लिए, इस काम करता है:

create table t_test (
     theID varchar(36) primary key, 
     nm varchar(50) 
     ) 
आप ऊपर में

theID का प्रयोग कर एक पाठ के रूप में guid स्टोर करने के लिए कर सकता है।

अधिक जानकारी यहां पाया जा सकता: http://www.sqlite.org/lang_createtable.html#rowid

@weenet ... per your comments, the following code works just fine. 

मैं तुम्हें अगर आप अभी भी मुसीबतों आ रही हैं, अपने कोड पोस्ट करने के लिए की जरूरत है।

create table t_test2 (
     theID int32 primary key, 
     nm varchar(50) 
     ); 
insert into t_test2 (theID, nm) values (1, 'don'); 
insert into t_test2 (theID, nm) values (2, 'weenet'); 
select * from t_test2; 

साथ ही, इस कोड (एक प्राथमिक कुंजी के रूप varchar) काम करता है ठीक:

create table t_test (
     theID varchar(36) primary key, 
     nm varchar(50) 
     ) 

insert into t_test (theID, nm) values ('abcdefg', 'don'); 
insert into t_test (theID, nm) values ('hijklmnop', 'weenet'); 
select * from t_test 
+0

ओह, मैं कहना चाहिए कि मैं इस की कोशिश की: तालिका t_test2 ( theID प्राथमिक कुंजी int32, एनएम varchar (50) ) बना सकते हैं और यह ठीक काम किया है, इसलिए मुझे लगता है मैं बनाने का एक नमूना आवश्यकता होगी लगता है कथन जिसका उपयोग आप अपने मुद्दे के आगे समाधान के लिए कर रहे हैं। –

+0

ऐसी वस्तु को सहेजने और पुनर्प्राप्त करने के साथ ऑब्जेक्ट बनाने का प्रयास करें। मेरा मानना ​​है कि आपको इंट 64 को इंट 32 डालने के प्रयास के बारे में एक त्रुटि मिलेगी। – sydneyos

+0

SQLite संस्करण 3.6.19 (200 9 -10-14) में विदेशी कुंजी के लिए समर्थन जोड़ा गया। – dan04

संबंधित मुद्दे