SQLite没有ROWID和INTEGER主键[关闭]

klsxnrf1  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(171)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

17天前关闭
Improve this question
1.是否应使用“WITHOUT ROWID”创建具有INTEGER PRIMARY KEY的新表?
文件似乎表明:
在优雅的系统中,即使没有WITHOUT ROWID关键字,所有表的行为也将与WITHOUT ROWID表相同。
https://www.sqlite.org/withoutrowid.html
此外,在ROWID别名INTEGER PRIMARY KEY vs rowid in SQLite上也存在空间开销
1.这篇文章似乎表明WITHOUT ROWID是旧数据库的兼容性。
一般来说,你不应该在任何新项目中使用WITHOUT ROWID表。引入此选项是为了支持与旧数据库的向后兼容性。
https://chumaky.team/blog/sqlite-primary-key-explained

htrmnn0y

htrmnn0y1#

实际上,WITHOUT ROWID的唯一好处是如果主键不是整数类型。因此,rowid列/索引不存在。但是,如果你有....整数主键.如果没有ROWID,那么你就有效地使用了rowid列/索引,但有细微的区别。

  • 列的值不能由SQLite内部生成,必须提供一个值。
  • null值将导致NOT NULL冲突,而不是SQLite内部生成的值。
  • 因此,值必须被管理,而对于rowid表,值可以留待生成。
  • 存在这样的情况,例如如果出于任何原因已经使用了最高可能值(9223372036854775807)。
  • 对于rowid表SQLite(只要AUTOINCREMENT没有被使用),将尝试查找未使用的值(永远不会知道这样的值没有被分配)
  • 对于一个没有ROWID表,你会怎么做?
  • 显然是一种罕见的情况(但很容易证明)

Really WITHOUT ROWID表用于具有非整数或复合类型主键的表。在这种情况下,rowid列和索引可能没有什么好处,只会浪费空间,并消耗额外的资源来管理rowid及其索引。

  • 然而,应该注意的是,SQLite的设计倾向于rowid和它的索引,它的处理速度更快(根据文档,速度高达两倍)。
  • 此外,整数是最小和最有效的存储,检索和操作最多8字节的64位有符号整数值(见上文,虽然有符号,你也可以有负值)。文本/字符串值很快就会超过8个字节。

我认为以下是官方文件中最相关的观点/声明之一:
因此,在某些情况下,WITHOUT ROWID表可以使用大约一半的磁盘空间,并且可以以几乎两倍的速度运行。当然,在现实世界的模式中,通常会有二级索引和/或UNIQUE约束,情况会更加复杂。但即使这样,在具有非整数或复合主键的表上使用WITHOUT ROWID通常也会有空间和性能上的优势。

  • 注意somecanoften.而不是全部,将,永远......最重要的是,它以 * 结尾。具有非整数或复合主键 *。

相关问题