在PrepERT上,PreparedStatement.executeUpdate()是否可以返回0?

时间:2013-08-15 18:08:28

标签: java sql jdbc

是否存在使用executeUpdate对象上的方法PreparedStatement执行的SQL INSERT语句返回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 个答案:

答案 0 :(得分:8)

所以我尝试了,是的,您可以使用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一起使用。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

来自executeUpdate()方法的documentation

  

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

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

答案 3 :(得分:-1)

再次阅读:

返回:(A)SQL数据操作语言(DML)语句的行数,或者(B)0不返回任何值的SQL语句的行数