SQLite

2009-03-28 10 views
43

में ऑटोमेशन के लिए प्रारंभ मूल्य सेट करें मैं SQLite में एक ऑटोमेशन क्षेत्र के लिए प्रारंभ मूल्य कैसे सेट कर सकता हूं?SQLite

उत्तर

19

तालिका में value-1 स्पष्ट रूप से डालें, फिर पंक्ति हटाएं।

संपादित करें: नीचे अगली टिप्पणी है, जो संपादन सीधे SQLITE_SEQUENCE मेज पर चर्चा करता है शायद बेहतर है: https://stackoverflow.com/a/692871/10093

+8

मुझे लगता है कि यह करने का यह सबसे अच्छा तरीका है, लेकिन यह सुंदर नहीं है। –

+0

यह मेरे लिए काम नहीं करता है। अगर मेरे पास केवल 1 प्रविष्टि (आईडी 1) वाली तालिका "उपयोगकर्ता" है, जबकि ऑटो-वृद्धि 3 पर है, तो दूसरा उपयोगकर्ता आईडी -1 के साथ डाला जाता है, फिर हटा दिया जाता है, अगला डाला गया उपयोगकर्ता अभी भी आईडी 4 है (फ़ायरफ़ॉक्स के लिए SQLite प्रबंधक एक्सटेंशन , अगर यह एक फर्क पड़ता है) – Assimilater

+1

एक कामकाज की तरह लगता है। मैं प्रश्न में तालिका के लिए sqlite_sequence तालिका रिकॉर्ड को संबोधित करना पसंद करता हूं। –

6

एक तरह से करने के लिए यह पहली पंक्ति स्पष्ट पंक्ति आईडी आप साथ शुरू करना चाहते हैं निर्दिष्ट करने सम्मिलित करने के लिए है । SQLite तब पंक्ति आईडी को सम्मिलित करेगा जो पिछले उच्चतम से अधिक है।

76
SQLite web site से

:

SQLite सबसे बड़ा ROWID कि एक मेज कभी विशेष SQLITE_SEQUENCE तालिका का उपयोग कर कार्य किया है का ट्रैक रखता है। SQLITE_SEQUENCE तालिका बनाई जाती है और स्वचालित रूप से प्रारंभ होता है जब एक सामान्य तालिका जिसमें एक ऑटोमेशन कॉलम होता है। SQLITE_SEQUENCE तालिका की सामग्री सामान्य अद्यतन, INSERT, और DELETE कथन का उपयोग करके संशोधित की जा सकती है। लेकिन इस तालिका में संशोधन करने से ऑटोमैनमेंट की मुख्य पीढ़ी एल्गोरिदम प्रभावित हो जाएगी। सुनिश्चित करें कि आप इस तरह के परिवर्तन करने से पहले क्या कर रहे हैं, यह सुनिश्चित करें कि आप क्या कर रहे हैं।

मैं इस की कोशिश की, और यह काम करता है:

UPDATE SQLITE_SEQUENCE SET seq = <n> WHERE name = '<table>' 

कहाँ n +1 ROWID आप चाहते हैं और तालिका है तालिका नाम है।

+0

निश्चित नहीं है, क्योंकि मुझे यकीन नहीं है कि एसक्लाइट आंतरिक कैसे काम करता है। यह ध्यान देने योग्य है कि जेएल और मेरे सुझाव ऊपर दिए गए हैं कि PHP की एमडीबी 2 लाइब्रेरी आईडी को बदलने का समर्थन करती है। अपने एसक्लाइट ड्राइवर स्रोत पर नज़र डालें: http://cvs.php.net/viewvc.cgi/pear/MDB2/MDB2/Driver/sqlite.php?view=markup –

+0

ईमानदारी मुद्दा नहीं है (मुझे लगता है, नहीं एक विशेषज्ञ या कुछ भी)।समस्या मुझे विश्वास है कि वे इस बारे में चेतावनी दे रहे हैं कि यदि आप MAX से कम आईडी (आईडी) के साथ एक पंक्ति हटाते हैं और इस तरह मैन्युअल रूप से स्वत: वृद्धि को सेट करते हैं और सेट करते हैं। प्राथमिक कुंजी उल्लंघन के कारण आप पहली डाली गई पंक्ति के बाद अटक जाएंगे। – Assimilater

+0

सटीक एल्गोरिदम को लिंक किए गए पृष्ठ पर दस्तावेज किया गया है, और संगतता को संरक्षित रखने के लिए किसी भी 3.x संस्करण में नहीं बदला जाएगा। –

4

SQLITE_SEQUENCE तालिका के समाधान में, इस तालिका में प्रविष्टि को ऑटोइनक्रिकमेंट कॉलम के साथ तालिका में पहले डालने के बाद जोड़ा जाना प्रतीत होता है। कुछ मामलों में यह परेशानी का कारण बन सकता है (यानी autoincrement अभी भी 1 से शुरू होता है, वांछित मूल्य से नहीं)।

7

मैं नीचे दी गई क्वेरी का उपयोग कर रहा हूं जो समस्या को हल करता है जब sqlite_sequence के पास तालिका के लिए रिकॉर्ड नहीं है (यानी पहला रिकॉर्ड तालिका में अभी तक जोड़ा नहीं गया था), अन्यथा यह अनुक्रम अद्यतन करता है।

REPLACE INTO sqlite_sequence (name, seq) VALUES ('<table>', <n>) 

मेरे लिए यह काम:

BEGIN TRANSACTION; 

UPDATE sqlite_sequence SET seq = <n> WHERE name = '<table>'; 

INSERT INTO sqlite_sequence (name,seq) SELECT '<table>', <n> WHERE NOT EXISTS 
      (SELECT changes() AS change FROM sqlite_sequence WHERE change <> 0); 
COMMIT; 
+0

यह एकमात्र बिल्कुल सही समाधान है। परिवर्तन वूडू मेरी आँखें पानी बनाता है, हालांकि;) – w00t

1

अब मैं अपने समाधान के रूप में यह प्रयोग किया जाता है। उपरोक्त उत्तर के लिए धन्यवाद।