为啥我的方法不是我的方法删除存在的表?

Posted

技术标签:

【中文标题】为啥我的方法不是我的方法删除存在的表?【英文标题】:How come my method isn't my method dropping a table that exists?为什么我的方法不是我的方法删除存在的表? 【发布时间】:2020-01-12 14:26:19 【问题描述】:

我有一个方法可以检查一个表是否存在,如果存在,它会删除它然后重新创建它。否则,它会创建表。使用这种方法完成是因为我必须为我的任务这样做。

我有一个打印语句告诉我该表确实存在(如果在检查它是否存在的if statement 内部,它会打印)。然后我收到一条错误消息:

无法创建表 org.postgresql.util.PSQLException:错误:“$1”位置或附近的语法错误:12

方法:

public static void createTable(Connection conn, String name, String description) 
   PreparedStatement pst = nul;
    Statement st = null;

    String SQL = "drop table ?; create table ?";

    try 
        if (tableExist(conn, name)) 
            System.out.println("Works");
            pst = conn.prepareStatement(SQL);
            pst.setString(1, name);
            pst.setString(2, description);
            int update = pst.executeUpdate();
         else 
            st = conn.createStatement();
            st.execute("create table " + description);
        
     catch (SQLException e) 
        System.out.println("Could not create table(s) " + e);
    

是不是我做错了什么?

【问题讨论】:

您不能在 JDBC 中将标识符(= 表名)作为参数传递,您需要将表名连接到 SQL 字符串中。 【参考方案1】:

这里有两件事:

使用drop table if exists executeupdate 是一个声明。 您不能将标识符作为参数传递,因此您必须修改查询字符串。

所以,发出两条语句:

"drop table if exists <table name>"
"create table . . . "

【讨论】:

某些 JDBC 驱动程序实际上确实允许通过 executeUpdate() 执行多个语句,尽管如此,即使在这种情况下,最好的设计还是使用单独的语句。 @TimBiegeleisen 虽然是这样,但 JDBC API 旨在一次执行一条语句。多个语句是非标准的(对于支持它的驱动程序,通常需要显式启用)。 你不能在 JDBC 中将标识符作为参数传递

以上是关于为啥我的方法不是我的方法删除存在的表?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的表没有被填充?

为啥我的代码在完成块中运行两次

为啥我的 RefCell 的零成本替代方案不是实现内部可变性的标准方法?

当我在 IRB 中声明时,为啥我的***方法在所有类上都是公共的(而不是私有的)?

为啥我的 Rhino Mocks Partial Mock 方法调用没有被模拟?

为啥不应该在删除/插入行的方法上调用 reloadData