【问题标题】:Drop table in old version of SQLite where IF EXISTS is not supported在不支持 IF EXISTS 的旧版本 SQLite 中删除表
【发布时间】:2023-04-08 08:48:01
【问题描述】:

我的 SQLite 版本不支持 IF EXISTS 运算符。如何删除一个可能存在也可能不存在的表而不给我一个错误?

我现在无法在实时应用程序上更新版本,因此我无法使用支持IF EXISTS 的 SQLite 版本。

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    你可以使用:

    DROP TABLE IF EXISTS TABLE_NAME;
    

    【讨论】:

    • OP 确实无法做到这一点,并在问题中说了这么多。
    • @IanMcLaird 虽然有趣的是,这是 SO 中的第一个问题,而这个答案正是我想要的(显然还有其他 120 人)
    • @IanMcLaird 它仍然可以帮助其他人,比如我自己。
    【解决方案2】:

    official documentation 说要使用 IF EXISTS,所以我怀疑你最好的计划是升级。

    如果不能,则需要看看是否可以对表进行一些琐碎的操作,无论表是否为空,都会成功;如果成功,您应该删除该表,如果失败,则该表已经消失。可以尝试的操作类型的示例可能是:

    SELECT COUNT(*) FROM theTable;
    

    请注意,您需要在语言级别捕获可能的错误,并且您可能希望将整个批次(探测、错误陷阱、删除表)包装在事务中。当然,如果您要进行错误处理,另一种方法是直接删除表并处理错误。

    【讨论】:

      【解决方案3】:

      就用这个吧。

      DROP TABLE TABLE_NAME;
      

      【讨论】:

      • 这可行,但如果表已经存在,它会给出错误
      • @patJnr:你的意思是,如果表 not 存在,它会给出错误。没错,但由于 OP 不支持 DROP TABLE IF EXISTS,这是最好的选择。抓住错误,分析它并继续。
      【解决方案4】:

      您可以以某种方式在查询中使用元数据表来确定该表是否存在:

      SELECT count(*) > 0 FROM sqlite_master where tbl_name = "<table_name>" and type="table"
      

      【讨论】:

      • 嗯……丢桌子的时候怎么用?
      • 你不能写 "if (SELECT count(*) FROM sqlite_master where tbl_name = "" and type="table") > 0 then drop table " 不要知道这是否是 sqlite 的正确语法。
      猜你喜欢
      • 2016-03-15
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多