Champ de clé primaire de réinitialisation SQLite

118

J'ai quelques tables dans SQLite et j'essaie de comprendre comment réinitialiser le champ de base de données auto-incrémenté.

J'ai lu que cela DELETE FROM tablenamedevrait tout supprimer et réinitialiser le champ d'auto-incrémentation 0, mais lorsque je le fais, cela supprime simplement les données. Lorsqu'un nouvel enregistrement est inséré, l'auto-incrémentation reprend là où il s'était arrêté avant la suppression.

Mes identpropriétés de champ sont les suivantes:

  • Type de champ :integer
  • Drapeaux sur le terrain : PRIMARY KEY, AUTOINCREMENT,UNIQUE

Est-ce important que j'ai construit la table dans SQLite Maestro et que j'exécute également l' DELETEinstruction dans SQLite Maestro?

Toute aide est la bienvenue.

Nathan
la source

Réponses:

245

Essaye ça:

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

Auto-incrémentation SQLite

SQLite garde la trace du plus grand ROWID qu'une table ait jamais contenu à l'aide de la SQLITE_SEQUENCEtable spéciale . La SQLITE_SEQUENCEtable est créée et initialisée automatiquement chaque fois qu'une table normale contenant une colonne AUTOINCREMENT est créée. Le contenu de la table SQLITE_SEQUENCE peut être modifié à l'aide d'instructions UPDATE, INSERT et DELETE ordinaires. Mais apporter des modifications à cette table perturbera probablement l'algorithme de génération de clé AUTOINCREMENT. Assurez-vous de savoir ce que vous faites avant d'entreprendre de tels changements.

Nick Dandoulakis
la source
9
Juste une petite remarque: le nom de la table dans la clause where est sensible à la casse
321X
5
une autre façon est de mettre à jour la table sqlite_sequence. update sqlite_sequence set seq = 0 where name = '<tablename>' Cela ne réinitialisera pas le rowid de la table sqlite_sequence.
binaire du
@binary, merci d'avoir mentionné une autre manière :) Je voudrais noter que SQLite réutilise l'espace "supprimé", donc cela ne fait pas vraiment de différence quelle solution nous choisirons.
Nick Dandoulakis
1
Notez que SQLite ne crée la table sqlite_sequence que lorsque vous définissez une colonne à auto-incrémentation. Cela n'existe pas avant.
Zachary Yates
@ZacharyYates, en effet, mais c'est déjà mentionné sur le texte cité.
Nick Dandoulakis
48

Vous pouvez réinitialiser par séquence de mise à jour après les lignes supprimées dans votre table

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';
Huỳnh Ngọc Bang
la source
pouvez-vous me dire comment faire cela pour la chambre?
Psycho
que voulez-vous dire @Psycho? Je ne peux pas comprendre :)
Huỳnh Ngọc Bang
en fait, je demandais comment faire cela dans la base de données de la salle ..... eh bien, le problème est résolu pour le moment
Psycho
@Psycho pouvez-vous me dire comment vous avez utilisé cela en utilisant la base de données Room?
prakashpun le
1

Comme option alternative, si vous disposez du navigateur de base de données Sqlite et que vous êtes plus enclin à une solution GUI, vous pouvez modifier la table sqlite_sequence où field name est le nom de votre table. Double-cliquez sur la cellule du champ seq et modifiez la valeur à 0 dans la boîte de dialogue qui apparaît.

Daniel Lefebvre
la source
0

Si vous souhaitez réinitialiser chaque RowId via le fournisseur de contenu, essayez ceci

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
la source