【问题标题】:org.postgresql.util.PSQLException: ERROR: the relation "test_id" does not exist. SQL state: 42883org.postgresql.util.PSQLException:错误:关系“test_id”不存在。 SQL 状态:42883
【发布时间】:2019-11-17 08:05:30
【问题描述】:

pgadmin4 将它保存在 postgresql 中后,我无法从“test”表中检索 id:

这里是“test”表的pgadmi4生成的创建脚本:

CREATE TABLE school.test
(
    test_id bigint NOT NULL DEFAULT nextval('school.test_test_id_seq'::regclass),
    name character varying(10) COLLATE pg_catalog."default"
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE school.test
    OWNER to postgres;

这里是通过 JDBC 将值插入“测试”表的代码:

        Connection conn = pstgConn.dbConnection();
        String query = "INSERT INTO school.test(name) VALUES (?)";
        try (PreparedStatement pst = conn.prepareStatement(query)) {
            pst.setString(1, "anything");
            pst.executeUpdate();
            //Get Sequential number of the table
            getSerialNum(conn);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

这里是获取受影响表的最后一个序列号的函数:

public void getSerialNum(Connection connection) {
        int serialNum = 0;
        try {
            Statement stmt = connection.createStatement();

            // get the postgresql serial field value with this query
            String query = "select currval('test_id')";

            ResultSet rs;

            rs = stmt.executeQuery(query);
            if (rs.next()) {
                serialNum = rs.getInt(1);
                System.out.println("serialNum = " + serialNum);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

我尝试通过 pdgadmin 控制台单独运行,结果相同。

结果如下:

org.postgresql.util.PSQLException:错误:关系“test_id”不存在 职位:16 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103) 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836) 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374) 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254) 在 com.cgi.training.javase.school.dao.testDAO.getSerialNum(testDAO.java:45) 在 com.cgi.training.javase.school.dao.testDAO.main(testDAO.java:21)

【问题讨论】:

  • 您的序列名为test_test_id_seq,但您将名称test_id 传递给currval() 的调用
  • 你说得对。谢谢@a_horse_with_no_name

标签: postgresql jdbc


【解决方案1】:

来自@a_horse_with_no_name 的响应:您的序列名为 test_test_id_seq,但您将名称 test_id 传递给 currval() 的调用 – a_horse_with_no_name

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 2015-10-09
    • 2017-04-26
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    相关资源
    最近更新 更多