У меня есть следующий запрос я использую для подготовленного заявления: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.
Вам необходимо предоставить аргументы для всех параметров '?' (Parameter) в вашем запросе. –
Вне темы: Почему вы цитируете имена столбцов? –
Для удобства чтения. – Buffalo