2013-08-14 3 views
0

У меня есть следующий запрос я использую для подготовленного заявления:Java + MySQL - добавление «на дубликат ключа обновления»

INSERT INTO mytable (`col1_id`, `col2`, `col3`, `col4`, `col5`, `col6`, `col7`) VALUES(?, ?, ?, ?, ?, ?, ?)" + 
      " ON DUPLICATE KEY UPDATE `col1`=?, `col2`=?, `col3`=?, `col4=?, `col5`=?, `col6`=?, `col7`=?; 

col1_id является первичным ключом.

Java упрощен код (будучи пропущены TRY/поймать, перебирая свою коллекцию, чтобы добавить больше заявлений в партии и т.д.):

Connection connection = null; 
    PreparedStatement statement = null; 
    String insertAdwordsQuery = DatabaseStatements.InsertAdwordsData(aProjectID); 

    connection = MysqlConnectionPool.GetClientDbConnection(aUserID); 
    connection.setAutoCommit(false);  

    statement = connection.prepareStatement(insertAdwordsQuery); 

    statement.setInt(1, x); 
    statement.setDouble(2, x); 
    statement.setLong(3, x); 
    statement.setLong(4, x); 
    statement.setDouble(5, x); 
    statement.setString(6, x); 
    statement.setString(7, x); 

    statement.addBatch(); 

    statement.executeUpdate(); 

    connection.commit(); 

При выполнении этого, генерируется исключение. Stacktrace:

java.sql.SQLException: No value specified for parameter 8 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919) 
    at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2603) 
    at com.mysql.jdbc.PreparedStatement.addBatch(PreparedStatement.java:1032) 
    ... 

Почему это происходит и каков параметр 8? код работал нормально с простой операцией INSERT, но начал сбой при добавлении НА ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ DUPLICATE.

+0

Вам необходимо предоставить аргументы для всех параметров '?' (Parameter) в вашем запросе. –

+0

Вне темы: Почему вы цитируете имена столбцов? –

+0

Для удобства чтения. – Buffalo

ответ

4

, что это «8 параметра»

Очень восьмой параметр, который вы добавили к запросу:

...VALUES(?, ?, ?, ?, ?, ?, ?)" + " ON DUPLICATE KEY UPDATE `col1`=? 
      1 2 3 4 5 6 7...      here it is - 8th! 

Во всяком случае, вы на самом деле не нужны параметры тор дублированных значений на всех :

INSERT INTO mytable VALUES (?, ?, ?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE `col1`=values(col1), `col2`=values(col2), 
`col3`=values(col3), `col4`=values(col4), `col5`=values(col5), 
`col6`=values(col6), `col7`=values(col7); 
+0

+1 для упоминания о избыточном параметре привязки (?) Для повторяющихся значений – sactiw

1

У вас есть в общей сложности 14 ? меток, то есть параметров. Однако при создании PreparedStatement объекта вы настраиваете только 7.

Вы должны иметь одинаковое количество setter метода, как количество ? (paramters) в PreparedStatement.

Вам нужно сделать -

statement.setInt(1, x); 
statement.setDouble(2, x); 
statement.setLong(3, x); 
statement.setLong(4, x); 
statement.setDouble(5, x); 
statement.setString(6, x); 
statement.setString(7, x); 

// the following should have the values you want to update when there a duplicate key 
statement.setInt(8, x); 
statement.setDouble(9, x); 
statement.setLong(10, x); 
statement.setLong(11, x); 
statement.setDouble(12, x); 
statement.setString(13, x); 
statement.setString(14, x); 

предложение - вам не нужно цитировать имена столбцов.

+0

Спасибо за ваше предложение и ответ! в то время как он совершенно функциональный, тот из «Your Common Sense» выглядит лучше, так как мне не нужно устанавливать одни и те же вещи дважды в заявлении. – Buffalo

Смежные вопросы