2016-12-09 1 views
0

Ich versuche, ein Update für ein ResultSet durchzuführen und erhalte die Ausnahme No primary key found for table nvp, für eine Tabelle mit einem Primärschlüssel.PostgreSQL-Fehler beim Aktualisieren von ResultSet "Kein Primärschlüssel für Tabelle gefunden" in Tabelle mit Schlüssel

Es ist PostgreSQL 9.6.1.0, und jdbc Treiberversion ist postgresql-9.4.1212.jar von ihrer Website heruntergeladen (JDBC42 Postgresql-Treiber, Version 9.4.1212 von here).

@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"); 
      } 
     } 
    } 
} 

Mit dem folgenden Ergebnis.

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) 

Ist das ein Fehler? Vermisse ich einen Schritt?

+0

, welche Linie Linie 28? –

+1

@ScaryWombat 'rs.updateString (1, s);' – Thrasher

+0

Tritt dies bei der ersten Iteration des While auf? Vermissen Sie eine 'updateRow()'? –

Antwort

4

Der Primärschlüssel muss angegeben werden, so dass die Ergebnismenge

Ändern Sie Ihre Abfrage auf line 17 zu aktualisierbar ist:

PreparedStatement ps = conn.prepareStatement("select id, value from nvp"... 
+1

Woher kommt dieses Zitat? – Bill

+0

ziemlich offensichtlich im Rückblick eh –

+1

Ich weiß nicht, wie man eine E-Book-Referenz hinzufügen, aber es ist von: JDBC Recipes: Ein Problem-Lösungs-Ansatz, Kapitel 6, Abschnitt 9 "Wie erstellen Sie ein aktualisierbares ResultSet?" – Thrasher

Verwandte Themen