2016-04-09 3 views
3

Если у нас есть таблица с 10 строками, и мы дважды выполняем этот запрос, мы получаем неправильное количество затронутых строк во второй раз.JDBC возвращает неправильное количество затронутых строк.

Statement st = open(); 

st.executeUpdate("UPDATE `tickets` SET price=1000"); // return 10 
st.executeUpdate("UPDATE `tickets` SET price=1000"); // return 10 

Очевидно, что это не правильно, потому что в первом запросе цена всех строк обновляется до 1000, а во втором ничего запроса на самом деле изменения, но он снова возвращается 10!

Как я могу получить количество реально обновляемых строк?

+0

Технически базы данных могут (и делать) обновлять строку в любом случае, даже если она имеет такое же значение (поскольку оно проще , или сравнение старого и нового значения может быть дороже, чем просто его обновление). –

+1

нет, если мы выполним эти запросы в командной строке mysql во втором запросе mysql return 0 затронутых строк – rezachess

+1

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

ответ

4

Спецификация JDBC-видимому, диктует, что водители имеют executeUpdate() возвращение количество строк нашли в заявлении UPDATE, а не количество строк на самом деле пострадавших.

Чтобы иметь MySQL Connector/J возвращает количество строк фактически измененных вы можете добавить свойство useAffectedRows=true к вашему связи URL, хотя documentation действительно предупреждает, что

не JDBC-совместимые, будет ломать большинство приложений, которые полагаются на строки «найденные» и «затронутые строки» для операторов DML

+2

Спецификация JDBC (4.2, раздел 13.1.2.2) говорит: «Выполняемый SQL-оператор возвращает количество строк, затронутых обновлением для операторов SQL Data Manipulation Language (DML)» _. Однако количество затронутых строк может быть разным для каждой базы данных (оно может обновляться в любом случае, даже если значение одинаковое: строки, измененные триггерами, могут быть или не включены, и т. Д.). –

+0

Обратите внимание, что это уже было (но по-разному сформулировано) в JDBC 1.2, поэтому мне интересно, что такое MySQL. –