当前位置: 首页 > 知识库问答 >
问题:

在带有键的表上更新结果集“未找到表的主键”时发生PostgreSQL错误

端木夕
2023-03-14

我正在尝试对ResultSet进行更新,但遇到异常,在具有主键的表上找不到表nvp的主键,

它是PostgreSQL9.6.1.0,jdbc驱动程序版本postgresql-9.4.1212.jar从他们的网站下载(JDBC42 Postgreql驱动程序,版本9.4.1212从这里)。

@Test
public void testUpdateableResultSet() throws Exception {
    String url = "jdbc:postgresql://localhost:5432/dot";
    Properties props = new Properties();
    props.setProperty("user", "dot_test");
    props.setProperty("password", "test_dot");
    props.setProperty("currentSchema", "dot_test");

    try(Connection conn = DriverManager.getConnection(url, props)) {
        conn.setAutoCommit(false);
        try(Statement s = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE)) {
            s.execute("drop table if exists nvp");
            s.execute("create table nvp (id int primary key, value text);");
            s.execute("insert into nvp (id, value) values (1, 'one_'), (2, 'two_')");
        }

        try(PreparedStatement ps = conn.prepareStatement("select value from nvp", 
                ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
                ResultSet rs = ps.executeQuery()) {
            while(rs.next()) {
                String s = rs.getString(1);
                if(s.endsWith("_")) {
                    s = s.replace("_", "");
                }
                else {
                    s = s + "_";
                }
                rs.updateString(1, s);              // line 28
                System.out.println("row updated");
            }
        }
    }
}

结果如下。

Testcase: testUpdateableResultSet(com.tekbot.lib.sql.SimpleTest):   Caused an ERROR
No primary key found for table nvp.
org.postgresql.util.PSQLException: No primary key found for table nvp.
    at org.postgresql.jdbc.PgResultSet.isUpdateable(PgResultSet.java:1586)
    at org.postgresql.jdbc.PgResultSet.checkUpdateable(PgResultSet.java:2722)
    at org.postgresql.jdbc.PgResultSet.updateValue(PgResultSet.java:3056)
    at org.postgresql.jdbc.PgResultSet.updateString(PgResultSet.java:1393)
    at com.tekbot.lib.sql.SimpleTest.testUpdateableResultSet(SimpleTest.java:28)

这是虫子吗?我错过了一步吗?

共有1个答案

东门奕
2023-03-14

必须指定主键,以便结果集可更新

第17行上的查询更改为:

PreparedStatement ps = conn.prepareStatement("select id, value from nvp"...
 类似资料:
  • 我的PostgreSQL数据库中有表,有两列:和。是主键,只是另一个具有唯一约束的整数列。 还有其他按主键引用用户的表。 下面是表说明: 以下是说明: 如何将PostgreSQL表中的主键从列替换为列,并保持数据完整性?

  • 我刚开始冬眠并尝试使用标准。我一直在从2个表(即主外键在realtion中的表)中获取结果。 我有Carpooler和SourceToDestination细节DTO,现在基于用户搜索数据,我想填充Carpooler Object,其中包含SourceToDestination细节,但我没有得到它,不知道如何使用标准API。 通过以上标准API,我只得到了SourceToDestination细节

  • abstractfacade.java TestTable.java TestTableRest.java TestTablePK.java 部署到服务器,并选择“测试RESTful Web服务”,测试页面无法加载: 查看glassfish事件日志,有两个严重错误: 在我用NetBeans编写错误报告之前,我只想看看这是否更可能是开发人员的错误,而不是开发人员的工具集的错误。想法? 数据库:Pos

  • 我对SQL和MySQL非常陌生。我试图修改表中的主键列,使其自动递增。这个主键也是另一个表中的外键。由于与另一个表中的外键相关的错误,我无法修改此列。以下是错误: 我确信这很简单,但我不知道为什么,我关注的书也没有说明原因。谢谢。

  • 问题内容: 我想删除所有其中没有键的项目。看一下我的代码: 我收到了。为什么?流不是并行的。最优雅的方法是什么? 问题答案: @Eran已经解释了如何更好地解决此问题。我将解释为什么会发生。 发生这种情况是因为您正在修改流源。您可能是或或其他非并行地图。假设它是一个。每个流都有的支持。如果分隔符没有和特征,那么,如文档所述: 绑定后,如果发现结构上的干扰,分离器应尽力而为。执行此操作的拆分器称为

  • 我在Postgres中有两个表<code>foo 当我尝试使用此命令将数据从 复制到 时: 我得到一个错误: 错误:重复的键值违反了唯一约束“bar_pkey” 详细信息:键(id)=(1)已存在。 当表