小心Sqlite的autoincrement可能会让你产生误解
2019-02-19 本文已影响2人
AItsuki
参考:
https://www.sqlite.org/autoinc.html
https://www.sqlite.org/lang_createtable.html#rowid
「译」sqlite为什么autoincrement不推荐使用2018/09/15
Sqlite官方:不推荐使用autoincrement
很多开发者在数据库建表时,都会自然而然的将主键声明为autoincrement
,意思是想让主键自动增长,而实际上这个想法是错误的,并且也是官方不建议这么使用的,它会占用额外的CPU,内存,磁盘空间和磁盘I / O开销。
autoincrement
的主键必须是INTEGER
类型,但是INTEGER
类型的主键本身默认就是自动增长的。
所以autoincrement
并不是字面上“自动增长”的意思(或许2.3.4版本以前是,但现在不是),而是表示当id等于最大支持的数后(9223372036854775807),再插入数据时是否可以重复使用原来已删除或没有使用的行。
autoincrement
默认为false时可以。
autoincrement
设置为true时不可以,并抛出错误:[Err] 13 - database or disk is full
甚至于,如果不需要建立表关系的情况下,主键也不是必须的,因为默认情况下sqlite会为表中每条数据配分一个自增长的rowid
,用于标识行的唯一。
可以试下这行代码看看是否能查到
SELECT rowid FROM TABLE_NAME;
rowid
也可替换成_rowid_
或oid
在建表时声明id INTEGER PRIMARY KEY
实际上是为rowid
声明了一个别名,所以这也是为什么INTERGER
主键默认自动增长的原因。