我需要編寫DROP COLUMN例程來操作SQLite數據庫。SQLite拖放列例程
它會被稱爲是這樣的:
dropColumn("SomeTable", "SomeColumn");
SQLite的常見問題解答說,要刪除列,你必須創建一個包含你想要的列的臨時表,然後在將數據複製它,然後重命名它。
將其封裝到例程中應該不會太困難。但看起來寫它會有些惱人。
當然有人已經寫了這樣的例程。如果是這樣,我可以把它偷走嗎? :)
我需要編寫DROP COLUMN例程來操作SQLite數據庫。SQLite拖放列例程
它會被稱爲是這樣的:
dropColumn("SomeTable", "SomeColumn");
SQLite的常見問題解答說,要刪除列,你必須創建一個包含你想要的列的臨時表,然後在將數據複製它,然後重命名它。
將其封裝到例程中應該不會太困難。但看起來寫它會有些惱人。
當然有人已經寫了這樣的例程。如果是這樣,我可以把它偷走嗎? :)
下面是一些僞代碼給你:
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
不要忘記桌子上的索引和觸發器! 「DROP TABLE」還會刪除參與索引,觸發器和外鍵。你可以使用'SELECT * FROM sqlite_master WHERE type!='table'和tbl_name ='MyTable')'來獲得它們的CREATE語句。當然,如果觸發器或索引使用已刪除的鍵,那麼您遇到了麻煩...... – Martijn 2011-02-17 16:10:42
@Martijn感謝提示。我把這個例子寫在我頭頂,所以它不完整,也不是它的意圖。然而,希望它能夠貫穿整個過程。 – Sparafusile 2011-02-17 16:19:36
@Sparausile:我的評論不是像提供更多信息那樣被批評爲批評。對不起,如果不明確。 :-) – Martijn 2011-02-18 09:55:35
這基本上取決於在什麼平臺上,你會在部署的SQLite。除非你想用裏面的例程重新編譯SQlite? – MPelletier 2010-10-22 14:15:01
@MPelletier,平臺是.Net。但我認爲這些代碼應該可以輕鬆地移植到任何其他現代平臺上。它應該只涉及執行一些SQL並進行一些字符串操作。 – 2010-10-22 23:29:28
在這種情況下,是的。在不解析原始的「創建表」的情況下,輕鬆地重新創建表的一件事是'PRAGMA table_info'。 – MPelletier 2010-10-23 01:12:38