在项目使用中我们常常需要一个自动增长的主键,比如加上AUTOINCREMENT约束使一个主键在每次插入数据时增长。由于一般而言你建立一个表会默认有一个成为ROWID的字段(除非声明为 without rowid),所以你添加的integer primary key其实就是rowid的别名而已,但是如果你加了autoincrement的约束以后,数据库引擎生成rowid的算法会发生相应的改变。
他们的生成算法如下
integer primary key:
获取当前column最大的值,如果没有达到64位有符号整数最大值,那么就在最大值的基础上+1作为新值 ,如果已经达到了最大值,那么就重新随机寻找一个未使用的,就是你删除一行的时候未用的那个值。如果真的已经没有可以插入了,那么就返回sqlITE_FULL错误。
integer primary key autoincrement:
获取当前column最大值,如果没达到最大值,增1插入,否则返回sqlITE_FULL。
integer primary key默认也是会自动增加的,使用autoincrement能够保证新插入的数据一定会比以前的大,但是也带来了许多额外的消耗,会消耗额外的cpu,磁盘空间,还有I/O磁盘操作带来的开销。官网给出的建议是:如果没有严格的需要它应当被避免使用,通常它不是必要的。
下面是我测试的一些数据:
insert操作 关闭事物处理 100W数据 not autoincrement 74.7088160515 s 100W数据 autoincrement 91.2676999569 s 开启事物处理 100W数据 not autoincrement 69.6123759747 s 100W数据 autoincrement 86.1955218315 s