Campo de clave principal de restablecimiento de SQLite

118

Tengo algunas tablas en SQLite y estoy tratando de averiguar cómo restablecer el campo de base de datos autoincrementado.

Leí que DELETE FROM tablenamedebería eliminar todo y restablecer el campo de incremento automático 0, pero cuando hago esto, simplemente elimina los datos. Cuando se inserta un nuevo registro, el autoincremento comienza donde lo dejó antes de la eliminación.

Mis identpropiedades de campo son las siguientes:

  • Tipo de campo :integer
  • Banderas de campo : PRIMARY KEY, AUTOINCREMENT,UNIQUE

¿Importa que construí la tabla en SQLite Maestro y también estoy ejecutando la DELETEdeclaración en SQLite Maestro?

Cualquier ayuda sería genial.

Nathan
fuente

Respuestas:

244

Prueba esto:

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

Aumento automático de SQLite

SQLite realiza un seguimiento del ROWID más grande que haya tenido una mesa utilizando la SQLITE_SEQUENCEtabla especial . La SQLITE_SEQUENCEtabla se crea e inicializa automáticamente cada vez que se crea una tabla normal que contiene una columna AUTOINCREMENT. El contenido de la tabla SQLITE_SEQUENCE se puede modificar mediante las instrucciones UPDATE, INSERT y DELETE ordinarias. Pero hacer modificaciones en esta tabla probablemente perturbará el algoritmo de generación de claves AUTOINCREMENT. Asegúrese de saber lo que está haciendo antes de realizar dichos cambios.

Nick Dandoulakis
fuente
9
Solo una pequeña nota al margen: el nombre de la tabla en donde la cláusula
distingue entre
5
otra forma es actualizar la tabla sqlite_sequence. update sqlite_sequence set seq = 0 where name = '<tablename>' Esto no restablecerá el rowid de la tabla sqlite_sequence.
binario
@binary, gracias por mencionar una forma alternativa :) Me gustaría señalar que SQLite reutiliza el espacio "eliminado", por lo que realmente no hace mucha diferencia qué solución elegiremos.
Nick Dandoulakis
1
Tenga en cuenta que SQLite solo crea la tabla sqlite_sequence cuando define una columna de autoincremento. No existe antes de entonces.
Zachary Yates
@ZacharyYates, de hecho, pero ya se menciona en el texto citado.
Nick Dandoulakis
48

Puede restablecer mediante la secuencia de actualización después de las filas eliminadas en su tabla

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';
Huỳnh Ngọc Bang
fuente
¿puedes decirme cómo hacer esto para la habitación?
Psycho
¿A qué te refieres con @Psycho? No puedo entender :)
Huỳnh Ngọc Bang
de hecho, estaba preguntando cómo hacer esto en Room Database ... bueno, el problema está resuelto por ahora
Psycho
@Psycho, ¿puedes decirme cómo usaste esto usando la base de datos de Room?
prakashpun
1

Como opción alternativa, si tiene el Explorador de base de datos Sqlite y está más inclinado a una solución GUI, puede editar la tabla sqlite_sequence donde el nombre del campo es el nombre de su tabla. Haga doble clic en la celda del campo seq y cambie el valor a 0 en el cuadro de diálogo que aparece.

Daniel Lefebvre
fuente
0

Si desea restablecer cada RowId a través del proveedor de contenido, intente esto

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);
}
UmAnusorn
fuente