2

executeUpdate在任何情况下,使用对象上的方法执行的 SQL INSERT 语句PreparedStatement将返回 0 而不会引发 SQLException?

例如:

String query = "INSERT INTO mytable (column1,column2) VALUES (5,6)";
PreparedStatement preparedStatement = connection.prepareStatement(query);
if(preparedStatement.executeUpdate()!=1){
// A strange error has occurred
} else{
// do what ever
}

我为什么要问?我目前总是检查以确保返回的行数等于 1,但我想知道如果它永远不应该返回除 1 之外的任何内容,这是否是矫枉过正。

4

4 回答 4

10

所以我试了一下,是的,你可以通过语句获得0返回值。INSERT如果您SELECT * FROM的表没有行INTO另一个表,则可能会发生这种情况。例如,说domaindomain2具有相同的架构并且domain2为空,执行以下操作

Connection con = dataSource.getConnection();
PreparedStatement ps = con.prepareStatement("INSERT INTO domain SELECT * FROM domain2");
System.out.println(ps.executeUpdate());

打印0

我唯一一次使用的返回值executeUpdate是在一行上使用一条DELETE语句来确保它之前存在并被删除。我认为你不应该将它与INSERT.

于 2013-08-15T18:40:08.780 回答
3

从方法的文档executeUpdate()

返回:(1) SQL 数据操作语言 (DML) 语句的行数或 (2) 0 用于不返回任何内容的 SQL 语句

0 似乎是一个非常自然的结果(即不是错误)。

于 2013-08-15T18:20:04.677 回答
2

对于您提供的示例 SQL 或要从参数插入单行的任何 SQL,如果没有发生 SQLException,结果将始终为 1。

于 2013-08-15T18:16:48.613 回答
-1

再读一遍:

返回: (A) SQL 数据操作语言 (DML) 语句的行数或 (B) 0 用于不返回任何内容的 SQL 语句

于 2020-02-11T19:01:46.787 回答