为啥我的方法不是我的方法删除存在的表?
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 中声明时,为啥我的***方法在所有类上都是公共的(而不是私有的)?