Campo de chave primária de redefinição de SQLite

118

Tenho algumas tabelas no SQLite e estou tentando descobrir como redefinir o campo de banco de dados incrementado automaticamente.

Eu li que DELETE FROM tablenamedeve excluir tudo e redefinir o campo de incremento automático de volta para 0, mas quando faço isso, ele apenas exclui os dados. Quando um novo registro é inserido, o incremento automático continua de onde parou antes da exclusão.

Minhas identpropriedades de campo são as seguintes:

  • Tipo de campo :integer
  • Campo Flags : PRIMARY KEY, AUTOINCREMENT,UNIQUE

Faz diferença se eu construí a tabela no SQLite Maestro e estou executando a DELETEinstrução no SQLite Maestro também?

Qualquer ajuda seria ótimo.

Nathan
fonte

Respostas:

244

Experimente isto:

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

SQLite Autoincrement

SQLite mantém registro do maior ROWID que uma tabela já manteve usando a SQLITE_SEQUENCEtabela especial . A SQLITE_SEQUENCEtabela é criada e inicializada automaticamente sempre que uma tabela normal que contém uma coluna AUTOINCREMENT é criada. O conteúdo da tabela SQLITE_SEQUENCE pode ser modificado usando instruções UPDATE, INSERT e DELETE comuns. Mas fazer modificações nesta tabela provavelmente perturbará o algoritmo de geração de chave AUTOINCREMENT. Certifique-se de saber o que está fazendo antes de realizar tais mudanças.

Nick Dandoulakis
fonte
9
Apenas uma pequena observação lateral: nome da tabela em que a cláusula
where diferencia
5
outra maneira é atualizar a tabela sqlite_sequence. update sqlite_sequence set seq = 0 where name = '<tablename>' Isso não irá redefinir o rowid da tabela sqlite_sequence.
binário
@binary, obrigado por mencionar uma forma alternativa :) Gostaria de observar que o SQLite reutiliza o espaço "excluído", então não faz muita diferença qual solução escolheremos.
Nick Dandoulakis
1
Observe que o SQLite só cria a tabela sqlite_sequence quando você define uma coluna de incremento automático. Não existe antes disso.
Zachary Yates
@ZacharyYates, sim, mas já está mencionado no texto citado.
Nick Dandoulakis
48

Você pode redefinir por sequência de atualização após linhas excluídas em sua tabela

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';
Huỳnh Ngọc Bang
fonte
você pode me dizer como fazer isso para o quarto?
Psicose
o que você quer dizer com @Psycho? Eu não consigo entender :)
Huỳnh Ngọc Bang,
na verdade, eu estava perguntando como fazer isso no Room Database ... bem, o problema está resolvido por enquanto
Psycho
@Psycho, você pode me dizer como usou isso usando o banco de dados do Room?
prakashpun
1

Como opção alternativa, se você tiver o navegador de banco de dados Sqlite e estiver mais inclinado a uma solução GUI, poderá editar a tabela sqlite_sequence em que nome do campo é o nome da sua tabela. Clique duas vezes na célula do campo seq e altere o valor para 0 na caixa de diálogo que aparece.

Daniel Lefebvre
fonte
0

Se você deseja redefinir cada RowId via provedor de conteúdo, tente isto

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
fonte