SQLite - 获取数据库中的行数

Ily*_*ski 45 sqlite

我希望在我的表中使用多行max(id).当它返回时NULL- 如果表中没有行 - 我想返回0.当有行时我想返回max(id) + 1.

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

这是我的发言:

SELECT CASE WHEN MAX(id) != NULL THEN (MAX(id) + 1) ELSE 0 END FROM words
Run Code Online (Sandbox Code Playgroud)

但它总是让我回归0.我做错了什么?

Vol*_*erK 237

您可以使用查询实际行数

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

  • 这确实会一直有效,但它需要sqlite来枚举表中的所有行.如果行数很大(比如说> 10,000)那么效率很低 (6认同)
  • 任何方式得到这个不计算?喜欢SQLite维护的一些元数据?我正在查看一个300GB的SQLite数据库文件,我需要从...获取信息... COUNT需要30米才能运行. (5认同)
  • 因此,与使用在create table模式中声明的字段相比,使用tblName;中的select count(rowid)获得更快的访问速度和表中行的==更有效。 (2认同)

Ste*_*eet 12

如果你想使用MAX(id)而不是count,在阅读了Pax的注释后,下面的SQL将为你提供你想要的

SELECT COALESCE(MAX(id)+1, 0) FROM words
Run Code Online (Sandbox Code Playgroud)

  • 聪明但只有你有一个基数为0的auto int pk才有效.VolkerK的答案更简单,更有效. (2认同)
  • @丰富.VolkerK的答案确实比较简单,并且是我自己的解决方案,然而,问题表明OP想要使用max(id)并且行从0开始编号并自动增加. (2认同)

pax*_*blo 9

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

SELECT CASE WHEN MAX(id) IS NULL THEN 0 ELSE (MAX(id) + 1) END FROM words
Run Code Online (Sandbox Code Playgroud)

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

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

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


gre*_*reg 5

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