2010-10-22 14 views
8

मुझे SQLite डेटाबेस में हेरफेर करने के लिए एक ड्रॉप कॉलम रूटीन लिखने की आवश्यकता है।SQLite ड्रॉप कॉलम दिनचर्या

वह कुछ इस तरह कहा जा सकता है:

dropColumn("SomeTable", "SomeColumn"); 

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

इसे नियमित रूप से समाहित करना बहुत कठिन नहीं होना चाहिए। लेकिन ऐसा लगता है कि इसे लिखना बहुत परेशान होगा।

निश्चित रूप से किसी ने पहले से ही इस तरह के एक दिनचर्या लिखा है। यदि हां, तो क्या मैं इसे चुरा सकता हूं? :)

+0

यह मूल रूप से क्या मंच आप पर SQLite तैनात होगा पर निर्भर है। जब तक आप नियमित रूप से SQlite को पुन: संकलित नहीं करना चाहते हैं? – MPelletier

+0

@MPelletier, मंच .Net है। लेकिन मुझे लगता है कि कोड किसी अन्य आधुनिक मंच पर आसानी से पोर्टेबल होना चाहिए। इसमें बस कुछ एसक्यूएल निष्पादित करना और कुछ स्ट्रिंग मैनिपुलेशन करना शामिल होना चाहिए। उस मामले में –

+0

, हाँ। मूल 'तालिका बनाएं' को पार्स किए बिना तालिका को आसानी से पुनर्निर्मित करने के लिए उपयोग करने की एक चीज़ 'PRAGMA table_info' है। – MPelletier

उत्तर

5

यहां आपके लिए कुछ छद्म कोड है:

columnNameList = "" 
newTableStr = "CREATE TABLE tempMyTable (" 
execute statement: "PRAGMA table_info('MyTable')" 
While looping through RecordSet 
    If RecordSet.name != tableRowToDeleteName 
    If columnNameList != "" Then columnNameList += "," 
    columnNameList += RecordSet.name 

    newTableStr += RecordSet.name + " " + RecordSet.type 
    If RecordSet.notnull Then 
     newTableStr += " NOT NULL" 
    End If 
    If RecordSet.dflt_value != "" Then 
     newTableStr += " DEFAULT(" + RecordSet.dflt_value + ")" 
    End If 
    If Not Last Record in RecordSet 
     newTableStr += "," 
    End If 
    End If 
End Loop 
newTableStr += ");" 

execute statement: newTableStr 
execute statement: "INSERT INTO tempMyTable (" + columnNameList + ")" + 
        "SELECT " + columnNameList + " FROM MyTable;" 

Delete table: MyTable 
Rename Table: tempMyTable to MyTable 
+1

तालिका पर इंडेक्स और ट्रिगर्स को न भूलें! 'ड्रोप टेबल' उपस्थित इंडेक्स, ट्रिगर और विदेशी कुंजी भी छोड़ देता है। आप उनके लिए CREATE स्टेटमेंट प्राप्त करने के लिए 'SELECT * से sqlite_master कहां टाइप करें! =' तालिका 'और tbl_name =' MyTable ') का उपयोग कर सकते हैं। बेशक, अगर ट्रिगर या इंडेक्स हटाए गए कुंजी का उपयोग करता है, तो आप परेशानी में हैं ... – Martijn

+0

@Martijn संकेतों के लिए धन्यवाद। मैंने इस उदाहरण को मेरे सिर के ऊपर से लिखा है, इसलिए यह पूरा नहीं हुआ है और न ही इसका इरादा था। उम्मीद है कि यह पूरे बिंदु पर मिला है। – Sparafusile

+0

@Sparausile: मेरी टिप्पणी आलोचना के रूप में अधिक जानकारी प्रदान करने के रूप में इतना नहीं था। क्षमा करें अगर वह स्पष्ट नहीं था। :-) – Martijn

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