2011-11-23 10 views
9

इस पर अमल नहीं करता है:आप प्राथमिक कुंजी के रूप में SQLite ROWID का उपयोग क्यों नहीं कर सकते?

create table TestTable (name text, age integer, primary key (ROWID)) 

त्रुटि संदेश है:

11-23 11: 05: ०५.२९८: त्रुटि/डाटाबेस (31,335): विफल 1 (तालिका TestTable कोई स्तंभ नामक ROWID) 0x2ab378 पर 'तालिका तालिका टेस्टटेबल (नाम टेक्स्ट, आयु पूर्णांक, प्राथमिक कुंजी (ROWID)) तैयार करते समय तैयार करें।

हालांकि, बाद TestTable बनाई गई है, यह तैयार करता है और ठीक कार्यान्वित:

create table TestTable (name text, age integer); 

insert into TestTable (name, age) values ('Styler', 27); 

select * from TestTable where ROWID=1; 

मैं संभवतः एक स्वत: वेतन वृद्धि प्राथमिक कुंजी और विदेशी कुंजी है जो जरूरत के लिए एक समाधान के रूप में देख सकते हैं ROWID एप्लिकेशन परत पर डेटा के रूप में आबादी के रूप में कभी भी इस्तेमाल नहीं किया जा रहा है। चूंकि ROWIDselect डिफ़ॉल्ट रूप से परिणाम सेट से छिपा हुआ है, इसलिए इसे एप्लिकेशन कुंजी से छुपाते हुए प्राथमिक कुंजी के साथ संबद्ध करना अच्छा होता। OracleBlog: ROWNUM and ROWID कहता है कि यह असंभव और अव्यवस्थित है, लेकिन इसके अलावा अधिक स्पष्टीकरण प्रदान नहीं करता है।

तो, 'यह संभव है' का उत्तर निश्चित रूप से कोई नहीं/अव्यवस्थित है, सवाल कम या ज्यादा 'क्यों नहीं' है?

+1

रिकॉर्ड अपडेट होने पर ROWNUM बदलता है, ROWID आपके सॉर्ट सेट के क्रम या क्रम के आधार पर परिवर्तन करता है। तो रोवनम खराब है क्योंकि जब भी मास्टर में बदलाव किया जाता है तो आप सभी विदेशी कुंजी अपडेट करते हैं। (ओवरहेड के बहुत सारे) और ROWID खराब है क्योंकि आईडी सेट तब तक मौजूद नहीं है जब तक परिणाम सेट नहीं बनाया जाता है और आदेश दिया जाता है। यदि यह अस्तित्व में नहीं है, तो आप इसमें शामिल नहीं हो सकते हैं। – xQbert

+0

@xQbert अगर ROWID को प्राथमिक कुंजी द्वारा संदर्भित किया जा रहा है, तो परिणाम सेट में कॉलम के क्रम के आधार पर यह कैसे बदल जाएगा? – styler1972

+0

आपकी तालिका में ROWID मौजूद नहीं है testtable का वर्णन करें। आप देखेंगे कि ROWID नहीं है। ROWID एक सिस्टम कॉलम और सिस्टम बनाए रखा मूल्य है। आपके पास सिस्टम कॉलम पर पीके नहीं हो सकता है; आपके पास ऐसा करने की अनुमति नहीं है। उपरोक्त के बारे में: मेरे पास यह पीछे है; ROWID अपडेट बनाम ROWNUM के आधार पर बदल सकता है जो कि कहां चयन के आधार पर बदलता है। – xQbert

उत्तर

28
SQLite.org से

:

एक मेज, प्रकार पूर्णांक प्राथमिक कुंजी के एक कॉलम होता है तो उस स्तंभ ROWID के लिए एक उपनाम हो जाता है। इसके बाद आप चार अलग-अलग नामों का उपयोग करके ROWID तक पहुंच सकते हैं, मूल तीन नाम ऊपर या INTEGER प्राथमिक कुंजी कॉलम को दिए गए नाम का वर्णन कर सकते हैं। ये सभी नाम एक दूसरे के लिए उपनाम हैं और किसी भी संदर्भ में समान रूप से अच्छी तरह से काम करते हैं।

बस इसे प्राथमिक कुंजी के रूप में उपयोग करें।

+1

किसी भी ऑटो वृद्धिशील प्राथमिक कुंजी को जोड़कर, मैं अनिवार्य रूप से प्राथमिक कुंजी के रूप में ROWID का उपयोग कर रहा हूं। सोच रहा था क्योंकि यह इतना आसान था कि मैं केवल प्राथमिक के रूप में पंक्ति को घोषित कर सकता था। स्पष्ट रूप से उस पर थोड़ा और चल रहा है। मुझे अलग-अलग सोचने के लिए यही मिलता है, मुझ पर शर्म की बात है: डी – styler1972

+2

[एक ऑटो-वृद्धि कुंजी जोड़ना थोड़ा व्यवहार बदलता है] (http://www.sqlite.org/autoinc.html)। ROWID हमेशा उपयुक्त नहीं होता है, मुख्य रूप से यदि monotonically बढ़ते मूल्य एक आवश्यकता है। – user2864740

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