如何使用 count(*) 检查表是不是为空
Posted
技术标签:
【中文标题】如何使用 count(*) 检查表是不是为空【英文标题】:How to check table is empty with count(*)如何使用 count(*) 检查表是否为空 【发布时间】:2015-06-19 10:06:56 【问题描述】:我正在尝试检查表是否为空。我编写了这个方法:
public boolean checkIfNULL()
throws SQLException, ClassNotFoundException
boolean flag=false;
System.out.println("Checking if table is empty...");
String sq = "select count(*) from TABLE1";
try
Class.forName(typeDB);
c = DriverManager.getConnection(path);
stm = c.prepareStatement(sq);
PreparedStatement stm = c.prepareStatement(sq);
int rowsAffected = stm.executeUpdate();
if(rowsAffected == 0)
flag=true;
catch (SQLException e)
System.out.println(e.getMessage());
finally
if (stm != null)
stm.close();
if (c != null)
c.close();
return flag;
但是某事正在发生,我收到一条错误消息 查询返回结果
Exceptionn: java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (Connection is closed)
如何查看check的返回值?
更新 1:
除了上面的查询,我还尝试了SELECT EXISTS(SELECT 1 FROM TABLE1)
但同样的事情正在发生..
更新 2: 我用这个:
ResultSet rs = stm.executeQuery();
if(!rs.next())
flag=true;
else
System.err.println("ERROR - The table has records...");
它会打印出ERROR - "The table has records..."
。这怎么可能?我通过 SQLite 管理器看到表,它是空的!
【问题讨论】:
我建议不要这样做。通常,我会推荐某种形式的EXISTS
,但我认为SQLite 不支持——但我仍然建议使用LIMIT 1
运行基本查询。如果您只关心“不存在行”和“至少存在一行”的情况,则无需强制引擎计算 每一 行。只要你看到任何行,你就知道答案了。
如果您发布异常,请包含完整的堆栈跟踪,它提供的信息可能有助于追踪原因。
【参考方案1】:
您正在执行SELECT
,因此您需要使用executeQuery
,而不是executeUpdate
。 executeUpdate
用于UPDATE
、DELETE
和INSERT
等语句,executeQuery
用于执行返回结果集的语句(如SELECT
)。
你需要执行一个select语句,然后做:
try (ResultSet rs = stm.executeQuery())
rs.next(); // You always have a row, with the count
int count = rs.getInt(1);
flag = count == 0;
更新中的代码不起作用,因为如果您执行SELECT count(*) FROM table
,那么您总是只有一行(带有计数)。
【讨论】:
以上是关于如何使用 count(*) 检查表是不是为空的主要内容,如果未能解决你的问题,请参考以下文章