不建议使用rowid作为sqlite主键

If you don’t want to read the whole post then just do this: Everytime you create a table with sqlite make sure to haveanINTEGER PRIMARY KEY AUTOINCREMENTcolumn (the rowid columnwill be an alias to this one).

If you have some time then read on…

A lot of people don’t realize thata rowidcan change. As always a simple example worths more than1000 words. You can test this example withSQLiteManager.

Create a table without a primary key:
CREATE TABLE test (name TEXT);

Insert some data into the table:
INSERT INTO test (name) VALUES (‘marco’);
INSERT INTO test (name) VALUES (‘giuly’);
INSERT INTO test (name) VALUES (‘gregory’);
INSERT INTO test (name) VALUES (‘house’);

Perform a SELECT rowid,* FROM test;
Here you go the result:
1marco
2giuly
3gregory
4house

Everything seems OK (until Now…)
Now delete a couple of rows:
DELETE FROM test WHERE name=’marco’;
DELETE FROM test WHERE name=’gregory’;

Now perform again: SELECT rowid,* FROM test;
Here it is the result:
2giuly
4house

Everything is fine,no?
That’s cool…

Now,perform a VACUUM on the database and run again thequery:
SELECT rowid,* FROM test;
Here it is the result:
1giuly
2house

Rowids are changed!!!! So please take extra care when you define atable and need to reference records using rowids. From the official documentation: “Rowids can change at any time andwithout notice. If you need to depend on your rowid,make it anINTEGER PRIMARY KEY,then it is guaranteed not to change”. And Iadd also AUTOINCREMENT so you are sure that the same rowid(s) arenot reused when rows are deleted.

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能