5

我怀疑如果我使用以下语句删除表,

     SQLiteDatabase db = this.getWritableDatabase();
     db.delete(date_difference, null, null);

那么如果我将一行作为新的第一条记录插入到表中,记录的 id 主键自动递增是否从 1 开始?

4

4 回答 4

4

如果插入时没有指定 ROWID,或者指定的 ROWID 的值为 NULL,则会自动创建适当的 ROWID。通常的算法是给新创建的行一个比插入前表中最大的 ROWID 大一的 ROWID。 如果表最初为空,则使用 1 的 ROWID。如果最大的 ROWID 等于最大可能的整数 (9223372036854775807),则数据库引擎开始随机挑选正候选 ROWID,直到找到以前未使用的 ROWID。

所以是的,删除表后,ID 将从 1 开始

http://www.sqlite.org/autoinc.html

于 2012-12-10T10:10:12.770 回答
2

提供的文档指出该删除方法是:

Convenience method for deleting rows in the database.

语法是:

int delete(String table, String whereClause, String[] whereArgs)

因此它不会再次从 1 开始。它将从最后一个增量继续。如果您删除了整个表,然后重新创建它,增量将从 1 开始。

于 2012-12-10T10:04:49.517 回答
1

SQLite使用名为 "sqlite_sequence" 的内部表来跟踪表所拥有的最大 ROWID 。每当创建包含 AUTOINCREMENT 列的普通表时,就会自动创建和初始化 sqlite_sequence 表**。sqlite_sequence 表的内容可以使用普通的 UPDATE、INSERT 和 DELETE 语句进行修改**。但是对这个表进行修改可能会扰乱 AUTOINCREMENT 密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。

所以当你删除你的表并重新创建它时,你应该让 SQLITE_SEQUENCE 从 0 重新开始。

你应该这样做:

Delete from date_difference;    
Delete from sqlite_sequence where name='date_difference';

注意,因为 where 子句中的字段'table name'区分大小写。

阅读内容以获取更多信息。

于 2012-12-10T10:08:38.257 回答
0

将主键字段定义为

INTEGER PRIMARY KEY AUTOINCREMENT DEFAULT 1 

如果您正在为主键字段插入任何值,请删除代码,如下所示

values.put(KEY_PRIMARY, object.getIntegerValue());
于 2014-07-23T07:34:07.477 回答