无ROWID优化(没有ROWID选择

摘自:https://www.sqlite.org/withoutrowid.html wtu


1.0介绍
默认情况下,SQLite数据库中的每一行都会有一个叫做rowid的特殊列,该列唯一标识数据库表中的某一行,然而如果在CREATE TABLE语句的后面添加没有rowid关键字,就会禁用rowid这一列。有时候省略掉rowid,能够带来空间和性能上的提升。
1.1语法
现在创建一个没有rowid的表,最直接的方式就是在创建表语句之后添加关键字没有rowid。例如:
创建表如果不存在wordcount (
词文本主键,
问整数
)没有ROWID。
如其他所有的SQL语法一样,关键字的大小写不敏感。如下的任何一种方式都可以接受:
没有ROWID, withoutrowid,没有ROWID。她们代表一个意思。

注意:如果表指定了没有ROWID属性,表必须指定主键。否则创建表的时候,会返回错误,错误的大体意思是指定没有ROWID的创建表语句缺少主键。

大多数情况下,ROWID和oid或者_rowid_代表一个意思。然而只有ROWID才可以出现在创建表的语句当中。

1.2兼容性
只有SQLite 3.8.2版本之后的程序才可以使用没有ROWID关键字。早期版本的SQLite打开携带没有ROWID属性的表,将会返回一个畸形的数据库模式的错误。

1.3怪癖(特殊性)
迄今为止,没有ROWID只能够被SQLite数据库使用,其他的数据库引擎并没有兼容该关键字。在正统的系统中,即使没有没有ROWID关键字,所有的表也应该表现的和没有ROWID的效果一样。然而,SQLite在一开始被设计的时候,就采用整型的ROWID来简化实现的方式。这种方法表现很好很多年了。但是随着SQLite的需求的增长,(需要表的主键确实correspondto底层的行键变得更加严重)对于表指定主键属性变得更加迫切,因此和rowkey的矛盾更加尖锐。为了兼容过去的已经被使用了很久很久的程序,因此没有ROWID的概念终于被添加到SQLite中,(没有ROWID概念是为了满足needwithout打破向后兼容性的数十亿SQLite databasesalready在使用时(大约2013年)。)
为了无缝的兼容过去成千上万的程序,没有ROWID的概念被添加到SQLite中。
2.0与携带ROWID表不同之处
没有ROWID是一个优化选项。她没有提供任何新的特性(capablilities)。操作携带ROWID表和操作不携带ROWID的表,使用的都是相同的语法。唯一的优点是节省磁盘空间,并且比普通的表快一些。

多数情况下,携带ROWID表和不携带ROWID表是可以互换的(互换)。但是没有ROWID表存在一些限制,而这些限制是普通的ROWID表不具备的。

1。指定了没有ROWID的表必须指定PRIMARYKEY,否则建表失败
2指定了没有ROWID的表不能够指定INTEGERPRIMARY KEY.In普通表,“整型主键”意味着thecolumn ROWID的别名。但由于没有rowid WITHOUTROWID表,特殊意义不再适用。一个整数PRIMARYKEY”列在没有ROWID表就像一个“INT PRIMARYKEY”列在一个普通的表:这是一个主键integeraffinity。
3指定了没有ROWID的表不能使用自动增量关键字

无ROWID优化(没有ROWID选择