2010-10-22 53 views
8

我需要編寫DROP COLUMN例程來操作SQLite數據庫。SQLite拖放列例程

它會被稱爲是這樣的:

dropColumn("SomeTable", "SomeColumn"); 

SQLite的常見問題解答說,要刪除列,你必須創建一個包含你想要的列的臨時表,然後在將數據複製它,然後重命名它。

將其封裝到例程中應該不會太困難。但看起來寫它會有些惱人。

當然有人已經寫了這樣的例程。如果是這樣,我可以把它偷走嗎? :)

+0

這基本上取決於在什麼平臺上,你會在部署的SQLite。除非你想用裏面的例程重新編譯SQlite? – MPelletier 2010-10-22 14:15:01

+0

@MPelletier,平臺是.Net。但我認爲這些代碼應該可以輕鬆地移植到任何其他現代平臺上。它應該只涉及執行一些SQL並進行一些字符串操作。 – 2010-10-22 23:29:28

+0

在這種情況下,是的。在不解析原始的「創建表」的情況下,輕鬆地重新創建表的一件事是'PRAGMA table_info'。 – MPelletier 2010-10-23 01:12:38

回答

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

不要忘記桌子上的索引和觸發器! 「DROP TABLE」還會刪除參與索引,觸發器和外鍵。你可以使用'SELECT * FROM sqlite_master WHERE type!='table'和tbl_name ='MyTable')'來獲得它們的CREATE語句。當然,如果觸發器或索引使用已刪除的鍵,那麼您遇到了麻煩...... – Martijn 2011-02-17 16:10:42

+0

@Martijn感謝提示。我把這個例子寫在我頭頂,所以它不完整,也不是它的意圖。然而,希望它能夠貫穿整個過程。 – Sparafusile 2011-02-17 16:19:36

+0

@Sparausile:我的評論不是像提供更多信息那樣被批評爲批評。對不起,如果不明確。 :-) – Martijn 2011-02-18 09:55:35