【发布时间】:2017-11-29 18:09:36
【问题描述】:
所以我正在使用连接创建一个 JDBC 程序。这是我第一次熟悉这种编程,所以如果我的问题是“愚蠢的”,请原谅。但是我已经在这个问题上停留了一段时间。我创建了 4 个新表。它编译得很好,但是当我运行它时,我得到一个“错误:关系“笑话”已经存在”。当我删除 createTableJoke 准备好的语句时,我的礼品表出现相同的错误(“错误:关系“礼物”已经存在”)。我的所有陈述都是如此。我做错了什么,PostgreSQL为什么这样做背后的逻辑是什么?我在下面包含了我的代码:
private static void createTables() throws SQLException {
PreparedStatement createTableJoke = null;
PreparedStatement createTableGift = null;
PreparedStatement createTableHat = null;
PreparedStatement createTableCracker = null;
Connection conn = null;
try {
conn = getDBConnection();
createTableJoke = conn.prepareStatement("CREATE TABLE Joke ( jid INTEGER PRIMARY KEY, joke CHAR(200) NOT NULL, royalty FLOAT NOT NULL);");
createTableJoke.executeUpdate();
createTableGift = conn.prepareStatement("CREATE TABLE Gift ( gid INTEGER PRIMARY KEY, description CHAR(100) NOT NULL, price FLOAT NOT NULL);");
createTableGift.executeUpdate();
createTableHat = conn.prepareStatement("CREATE TABLE Hat ( hid INTEGER PRIMARY KEY, description CHAR(100) NOT NULL, price FLOAT NOT NULL);");
createTableHat.executeUpdate();
createTableCracker = conn.prepareStatement("CREATE TABLE Cracker (cid INTEGER PRIMARY KEY, name CHAR(20) NOT NULL, jid INTEGER REFERENCES Joke(jid), gid INTEGER REFERENCES Gift(gid), hid INTEGER REFERENCES Hat(hid), saleprice NUMERIC CHECK (saleprice > 0), quantity INTEGER NOT NULL);");
createTableCracker.executeUpdate();
} catch (SQLException e){
System.out.println(e.getMessage());
}
finally {
if ((createTableJoke != null) && (createTableGift != null) && (createTableHat != null) && (createTableCracker != null)){
createTableJoke.close();
createTableGift.close();
createTableHat.close();
createTableCracker.close();
}
if (conn != null) {
conn.close();
}
}
}
【问题讨论】:
-
“已经存在”的哪一部分让您感到困惑?您显然已经运行了一次程序而没有错误,所以现在这些表存在于数据库中。如果数据库不保留您创建的内容,它还有什么意义?
-
好奇:你为什么用
PreparedStatement来执行DDL语句?请改用Statement,并将其重用于所有 4 个executeUpdate调用。
标签: java sql postgresql jdbc prepared-statement