【问题标题】:SQLite drop column routineSQLite 删除列例程
【发布时间】:2012-05-09 08:08:07
【问题描述】:

我需要编写一个 DROP COLUMN 例程来操作 SQLite 数据库。

它会被这样称呼:

dropColumn("SomeTable", "SomeColumn");

SQLite 常见问题解答说要删除列,您必须创建一个仅包含所需列的临时表,然后将数据复制到其中,然后重命名。

将它封装到例程中应该不会太难。不过写起来好像有点烦。

肯定有人已经写过这样的例程了。如果可以,请问我可以偷吗? :)

【问题讨论】:

  • 这基本上取决于您将在什么平台上部署 SQLite。除非你想用里面的例程重新编译 SQlite?
  • @MPelletier,平台是.Net。但我认为代码应该很容易移植到任何其他现代平台。它应该只涉及执行一些 SQL 并进行一些字符串操作。
  • 在那种情况下,是的。在不解析原始Create Table 的情况下轻松重新创建表的一件事是PRAGMA table_info
  • @MPelletier,谢谢,这看起来很有用。

标签: sqlite


【解决方案1】:

这里有一些伪代码:

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' AND tbl_name = 'MyTable') 为它们获取 CREATE 语句。当然,如果触发器或索引使用已删除的键,那你就有麻烦了……
  • @Martijn 感谢您的提示。我在脑海中写下了这个例子,所以它不完整,也不是有意的。但希望它能够理解这一点。
  • @Sparausile:我的评论与其说是批评,不如说是提供更多信息。抱歉,如果不清楚。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
相关资源
最近更新 更多