【问题标题】:SQLite - getting number of rows in a databaseSQLite - 获取数据库中的行数
【发布时间】:2010-10-14 17:19:37
【问题描述】:

我想使用max(id) 获取表中的行数。当它返回 NULL - 如果表中没有行 - 我想返回 0。当有行时我想返回 max(id) + 1

我的行从 0 开始编号并自动增加。

这是我的声明:

SELECT CASE WHEN MAX(id) != NULL THEN (MAX(id) + 1) ELSE 0 END FROM words

但它总是返回 0。我做错了什么?

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    可以查询实际行数

    SELECT Count(*) FROM tblName
    https://www.w3schools.com/sql/sql_count_avg_sum.asp

    【讨论】:

    • 这确实会一直有效,但它需要 sqlite 枚举表中的所有行。如果行数很大(例如> 10,000),效率会很低
    • 因此使用select count(rowid) from tblName; 可以更快地访问,== 表中的行数比使用create table 架构中声明的字段更有效。
    • 有什么方法可以得到这个而不用计算?就像 SQLite 维护的一些元数据一样?我正在查看一个 300GB 的 SQLite db 文件,我需要从中获取信息... A COUNT 最多需要 30m 才能运行。
    【解决方案2】:

    在 SQL 中,NULL = NULL 为 false,通常必须使用 IS NULL:

    SELECT CASE WHEN MAX(id) IS NULL THEN 0 ELSE (MAX(id) + 1) END FROM words
    

    但是,如果你想要行数,你应该只使用count(id),因为如果你的行是 (0,1,3,5,9),你的解决方案将给出 10,它应该给出 5。

    如果你能保证你的 ids 总是从 0 到 N,max(id)+1 可能会更快,具体取决于索引的实现(遍历平衡的右侧可能会更快)树而不是遍历整棵树,计数。

    但这是非常特定于实现的,我建议不要依赖它,尤其是因为它将您的性能锁定到特定的 DBMS。

    【讨论】:

      【解决方案3】:

      如果您想使用 MAX(id) 而不是计数,则在从 Pax 读取 cmets 后,以下 SQL 将为您提供所需的内容

      SELECT COALESCE(MAX(id)+1, 0) FROM words
      

      【讨论】:

      • 聪明,但只有当你有一个基数为 0 的自动 int pk 时才有效。VolkerK 的答案更简单有效。
      • @Rich。 VolkerK 的答案确实更简单,并且是我自己会采用的解决方案,但是,问题表明 OP 想要使用 max(id) 并且行从 0 开始编号并自动增加。
      • @JoeLyga,这很奇怪。 2002年3月Sqlite 2.4.0版本增加了COALESCE功能,你们有真正古老的版本吗?
      【解决方案4】:

      如果我正确理解了您的问题,我遇到了同样的问题,我想知道在 SQLite 操作中每次插入性能后最后插入的 id。我尝试了以下语句:

      select * from table_name order by id desc limit 1
      

      id 是 table_name 的第一列和主键,上面提到的语句显示了具有最大 id 的记录。

      但前提是你从来没有删除任何行,所以id的数量等于行的数量。

      【讨论】:

        【解决方案5】:

        不确定我是否理解您的问题,但 max(id) 根本不会给您行数。例如,如果您只有一行 id = 13(假设您删除了前面的行),您将拥有 max(id) = 13 但行数为 1。正确(也是最快)的解决方案是使用数数()。顺便说一句,如果您想知道为什么会有星号,那是因为您可以根据标准计算行数。

        【讨论】:

          【解决方案6】:

          VolkerK 答案的扩展,为了让代码更具可读性,可以使用 AS 来引用计数,示例如下:

          SELECT COUNT(*) AS c from profile

          这使得在某些框架中更容易阅读,例如,我使用的是 Exponent 的 (React Native) Sqlite 集成,并且没有 AS 语句,代码非常难看。

          【讨论】:

            猜你喜欢
            • 2011-06-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-28
            • 2015-08-28
            • 2018-05-28
            • 2012-01-06
            • 2012-06-06
            相关资源
            最近更新 更多