2016-06-22 2 views
0

Мои исследования, посвященные auto_generated_keys, дали мне несколько советов о подготовленных операциях, которые могут быть прослушиваемы, но никаких проблем, касающихся обычных операторов, как видно ниже.автозавершение оператора сгенерировано. Ключи кажутся бесполезными. Java w/MariaDB 10.x

Код до сих пор дает мне ключи в наборе результатов, который имеет столько строк, сколько обновляется. Но, по моим ожиданиям, метод getInt (1) не дает мне идентификатор с автоматическим добавлением таблицы, а автоматически учитывает значение от 1 до конца набора результатов.

В чем я ошибаюсь? Я изменил код, чтобы использовать com.mysql.jdbc, поскольку разъемы org.mariadb.jdbc обновлены до последней версии.

Или это еще один вариант, который мне нужно установить где-нибудь?

Anyways за вашу помощь еще нет.

public void updateFZSetToUsed() { 

    /* 
    * Variablendeklaration 
    * 
    */ 

    Connection conn = null; 
    Statement stmt1 = null, stmt2 = null; 
    ResultSet rs = null, rs2 = null; 

    String stmtstr1, stmtstr2; 



    try { 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     } catch (Exception WPex) { 
      System.out.println(WPex); 
     } 
    try { 
     conn = DriverManager.getConnection("jdbc:mysql://"+configVars.getProperty("serverIP")+"/"+configVars.getProperty("db")+"?", configVars.getProperty("usr"), configVars.getProperty("pw")); 


     stmt2 = conn.createStatement(); 


     stmt2.executeUpdate("UPDATE fz SET fz_used = 1 WHERE fz_id in (SELECT calls_fz FROM calls)", Statement.RETURN_GENERATED_KEYS); 

     rs2 = stmt2.getGeneratedKeys(); 

     while(rs2 != null && rs2.next()) { 

      System.out.println(rs2.getInt(1)); 

     } 





    } catch (SQLException singleStoreExc) { 
     // handle any errors 

     System.out.println("updateFZSetToUsed SQLException: " + singleStoreExc.getMessage()); 
     System.out.println("updateFZSetToUsed SQLState: " + singleStoreExc.getSQLState()); 
     System.out.println("updateFZSetToUsed VendorError: " + singleStoreExc.getErrorCode()); 

     return retString; 
    } finally { 

     if (rs != null) { 
      try { 
       rs.close(); 
      } catch (SQLException sqlEx) 
      { 
       System.out.println("rsclose fehler"); 
      } 
      rs = null; 
     } 

     if (rs2 != null) { 
      try { 
       rs2.close(); 
      } catch (SQLException sqlEx) 
      { 
       System.out.println("rs2close fehler"); 
      } 
      rs2 = null; 
     } 



     if (stmt1 != null) { 
      try { 
       stmt1.close(); 
      } catch (SQLException sqlEx) { 
       System.out.println("stmt1cclose fehler"); 
      } 

      stmt1 = null; 
     } 

     if (stmt2 != null) { 
      try { 
       stmt2.close(); 
      } catch (SQLException sqlEx) { 
       System.out.println("stmt2cclose fehler"); 
      } 

      stmt2 = null; 
     } 

     if (stmt2 != null) { 
      try { 
       stmt2.close(); 
      } catch (SQLException sqlEx) { 
       System.out.println("stmt2cclose fehler"); 
      } 

      stmt2 = null; 
     } 


     if (conn != null) { 
      try { 
       conn.close(); 
      } 
      catch (SQLException sqlEx) { 
       System.out.println("conn close() Error "+sqlEx); 
      } 
     } 
    } 



} 

ответ

0

Если вы хотите узнать, сколько строк было изменено, используйте отдельный вызов, чтобы получить «rows_affected».

Если вам нужно, чтобы UPDATE работал быстрее, используйте обновление с несколькими столами или используйте EXISTS. Любой подход, вероятно, избежит полного сканирования fx.

calls нуждается INDEX(calls_fz)

Я думаю RETURN_GENERATED_KEYS относится только к INSERT заявления, не UPDATE заявления; что вы думаете?

+0

Эй, спасибо за ваш ответ. Мне нужно было быстрое решение, поэтому я создаю работу для своей проблемы. (2 разных вопроса, насколько я помню) Но на самом деле это похоже на то, как вы описали: значения id возвращаются только операторами INSERT. Возможно, моя память обманула меня по этой детали, когда я попытался вспомнить спецификации команд mysqlI-XXX из php. Еще раз спасибо за ваш вклад. Я ценю это. – DigitalDude