PostgreSQL JDBC - 使用PreparedStatements创建表时已存在关系

时间:2017-11-29 18:09:37

标签: java sql postgresql jdbc prepared-statement

所以我使用连接创建JDBC程序。这是我第一次熟悉这种编程,所以如果我的问题出现在" dumb",请原谅。但是我一直坚持这个问题。我创建了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();
    }
}

}

2 个答案:

答案 0 :(得分:0)

这种错误意味着已经创建了所有这些表。使用pgAdmin(在Microsoft Windows操作系统上,它通常与PostgreSQL安装一起使用)或psql客户端连接到数据库并检查表是否存在。

答案 1 :(得分:0)

有两种情况:

  1. 如果有现有表格,您不关心保留现有表格。在这种情况下,在创建之前发出“DROP TABLE IF EXISTS Joke”。这将确保删除表,当表不存在时,表不会失败。

  2. 您关心表格的现有内容。在这种情况下,发出“CREATE TABLE IF NOT NOT EXISTS Joke”...而不是普通的CREATE TABLE。这将确保表存在,如果它已经存在,则不会创建表。另请注意,如果更改create语句中的结构并且表存在,则结构中的更改不适用。