SQLite重置主键字段


118

我在SQLite中有一些表,并且试图找出如何重置自动递增的数据库字段。

我读到DELETE FROM tablename应该删除所有内容,并将auto-incrementment字段重置为0,但是这样做时,它只会删除数据。插入新记录后,自动增量会在删除前从中断处开始提取。

我的ident字段属性如下:

  • 栏位类型integer
  • 字段标志PRIMARY KEYAUTOINCREMENTUNIQUE

我在SQLite Maestro中建立表并在SQLite Maestro中执行DELETE语句也有关系吗?

任何帮助都会很棒。

Answers:


244

试试这个:

delete from your_table;    
delete from sqlite_sequence where name='your_table';

SQLite自动增量

SQLite使用特殊SQLITE_SEQUENCE跟踪表曾经拥有的最大ROWID 。SQLITE_SEQUENCE每当创建包含AUTOINCREMENT列的普通表时,都会自动创建并初始化该 表。可以使用普通的UPDATE,INSERT和DELETE语句修改SQLITE_SEQUENCE表的内容。但是对此表进行修改可能会扰乱AUTOINCREMENT密钥生成算法。进行此类更改之前,请确保您知道自己在做什么。


9
请注意:where子句中的表名区分大小写
321X 2011年

5
另一种方法是更新sqlite_sequence表。更新sqlite_sequence设置seq = 0,其中name ='<表名>'这不会重置sqlite_sequence表的rowid。
2012年

@binary,感谢您提到另一种方法:)我想指出SQLite重用了“已删除”空间,因此我们选择哪种解决方案并没有多大区别。
Nick Dandoulakis 2012年

1
请注意,当您定义自动增量列时,SQLite仅创建sqlite_sequence表。在此之前不存在。
Zachary Yates 2014年

的确,@ ZacharyYates,但是在引用的文本中已经提到过。
Nick Dandoulakis 2014年

47

您可以在表中删除行后按更新顺序重置

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';

你能告诉我如何做这个房间吗?
Psycho

@Psycho是什么意思?我不明白:)
黄长发玉邦

实际上我是在问如何在会议室数据库中执行此操作.....好了,现在解决了这个问题
Psycho

@Psycho能否告诉我您如何使用Room数据库使用此功能?
prakashpun

1

作为一种替代选择,如果您拥有Sqlite数据库浏览器并且更倾向于GUI解决方案,则可以编辑sqlite_sequence表,其中字段名是表名。双击字段seq的单元格,然后在弹出的对话框中将该值更改为0。


0

如果您想通过内容提供商重置每个RowId,请尝试以下操作

rowCounter=1;
do {            
            rowId = cursor.getInt(0);
            ContentValues values;
            values = new ContentValues();
            values.put(Table_Health.COLUMN_ID,
                       rowCounter);
            updateData2DB(context, values, rowId);
            rowCounter++;

        while (cursor.moveToNext());

public static void updateData2DB(Context context, ContentValues values, int rowId) {
    Uri uri;
    uri = Uri.parseContentProvider.CONTENT_URI_HEALTH + "/" + rowId);
    context.getContentResolver().update(uri, values, null, null);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.