我怀疑如果我使用以下语句删除表,
SQLiteDatabase db = this.getWritableDatabase();
db.delete(date_difference, null, null);
那么如果我将一行作为新的第一条记录插入到表中,记录的 id 主键自动递增是否从 1 开始?
我怀疑如果我使用以下语句删除表,
SQLiteDatabase db = this.getWritableDatabase();
db.delete(date_difference, null, null);
那么如果我将一行作为新的第一条记录插入到表中,记录的 id 主键自动递增是否从 1 开始?
如果插入时没有指定 ROWID,或者指定的 ROWID 的值为 NULL,则会自动创建适当的 ROWID。通常的算法是给新创建的行一个比插入前表中最大的 ROWID 大一的 ROWID。 如果表最初为空,则使用 1 的 ROWID。如果最大的 ROWID 等于最大可能的整数 (9223372036854775807),则数据库引擎开始随机挑选正候选 ROWID,直到找到以前未使用的 ROWID。
所以是的,删除表后,ID 将从 1 开始
提供的文档指出该删除方法是:
Convenience method for deleting rows in the database.
语法是:
int delete(String table, String whereClause, String[] whereArgs)
因此它不会再次从 1 开始。它将从最后一个增量继续。如果您删除了整个表,然后重新创建它,增量将从 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'
区分大小写。
阅读此内容以获取更多信息。
将主键字段定义为
INTEGER PRIMARY KEY AUTOINCREMENT DEFAULT 1
如果您正在为主键字段插入任何值,请删除代码,如下所示
values.put(KEY_PRIMARY, object.getIntegerValue());