【问题标题】:query returning amount of rows including ones that were deleted,查询返回的行数,包括已删除的行数,
【发布时间】:2014-04-21 14:43:38
【问题描述】:

所以我尝试使用JDBC 获取mysql 表中存在的行数,但使用第一列作为参考,因为这是存在的行数,但此列位于AUTO_INCREMENT 但是,假设n rows从表中删除,然后一些新的是inserted,新的行号自然会保持相同的顺序计数,当我想计算表的行数时有,我的getTableInfo 方法返回行数,包括被删除的行数。我该如何解决这个问题?可以这样做吗?

public int getTableInfo(String tableName, String db, Boolean columnCount,
        Boolean rowCount) {

    TABLE = tableName;

    Connection getTableInfoConn = this.getConnect_to_DB(db);

    try {
        PreparedStatement prepStatement = getTableInfoConn
                .prepareStatement("SELECT * FROM `" + tableName + "`");

        ResultSet res = prepStatement.executeQuery();

        if ((columnCount == false) && (rowCount == false)
                || (columnCount == null) && (rowCount == false)
                || (columnCount == false) && (rowCount == null)
                || (columnCount == null) && (rowCount == null)) {

            JOptionPane.showMessageDialog(null,
                    "uno de los booleanos debe ser TRUE", null,
                    JOptionPane.ERROR_MESSAGE, null);

        } else {

            if (columnCount == false && rowCount == true
                    || columnCount == null) {

                while (res.next()) {

                    resultMetaData = res.getInt(1);
                }
            } else if (columnCount == true && rowCount == false
                    || rowCount == null) {

                metaData = res.getMetaData();

                resultMetaData = metaData.getColumnCount();

            }

        }

    } catch (SQLException e) {

        JOptionPane.showMessageDialog(null, "Error in getTableInfo():" + e);
    }

    return resultMetaData;

}

【问题讨论】:

  • 仅供参考:如果 tableName 来自用户,则此代码会受到 SQL 注入。
  • 是的,谢谢,我还在学习,但我会尽快实现。

标签: java mysql jdbc


【解决方案1】:

如果您只想计算表中的行数,您可以这样做:

SELECT COUNT(*) FROM MyTable

那么res.getInt(1)应该是表中的行数。

如果您还想计算已删除的行,并且您在 ID 上有自动增量,那么您需要类似:

SELECT MAX(ID) FROM MyTable

那么res.getInt(1)应该是表中的行数+删除的行数。

这取决于您的自动增量的正确性。为了数据库优化,一些自动增量实际上会跳过数字。这通常不是自动递增的目的,因此它们中的任何一个通常都不能保证。话虽如此,如果通过某种配置可以保证它是正确的,那么这将起作用。

或者,您可以有一个MyTableDeleted 表。您可以在MyTable 上设置一个删除触发器,以将该行填充到MyTableDeleted。那么获取删除的数量就很容易了。

【讨论】:

  • 这就是我的做法,但它返回了我上面已经说过的内容。
  • @user3363537 我在你的代码中没有看到COUNT(*)
【解决方案2】:

AUTO_INCREMENT 列中存储的值与表中的行数相同。

要获取表中的行数,您可以使用 SELECT 列表中的聚合函数运行查询(例如 COUNT(1)SUM(1)。 )

或者,如果你想使用一种低效的方法(比如检索整个表,通过痛苦的行获取每一行),你可以简单地在循环之前初始化一个简单的计数器变量,然后将计数器变量增加 1获取的每一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2017-02-25
    • 2017-07-28
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多