如何使用 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,而不是executeUpdateexecuteUpdate 用于UPDATEDELETEINSERT 等语句,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(*) 检查表是不是为空的主要内容,如果未能解决你的问题,请参考以下文章

如何检查火花数据框是不是为空?

如何检查火花数据框是不是为空?

两个表连接时如何检查字段是不是为空

带有 Sqlite 的 Android - 如何检查表是不是存在以及是不是为空

Sequelize 检查表为空

如何检查 Stack<T> 是不是为空