web-dev-qa-db-fra.com

Champ de clé primaire de réinitialisation SQLite

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

Je lis ça DELETE FROM tablename devrait tout supprimer et réinitialiser le champ d’incrémentation automatique sur 0, mais lorsque je le fais, les données sont supprimées. Lorsqu'un nouvel enregistrement est inséré, l'auto-incrémentation reprend là où elle s'était arrêtée avant la suppression.

Les propriétés de mon champ ident sont les suivantes:

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

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

Toute aide est la bienvenue.

105
Nathan

Essaye ça:

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

SQLite Autoincrement

SQLite garde la trace du plus grand ROWID qu'une table ait jamais eu en utilisant le spécial SQLITE_SEQUENCE table . Le SQLITE_SEQUENCE table 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 des instructions ordinaires UPDATE, INSERT et DELETE. 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.

218
Nick Dandoulakis

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';
36

Si vous souhaitez réinitialiser tous les 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);
}
0
UmAnusorn

Si vous avez le navigateur de base de données SQLite et que vous êtes plus enclin à utiliser une solution graphique, vous pouvez modifier la table sqlite_sequence où nom de champ est le nom de votre table. Double-cliquez sur la cellule du champ seq et changez la valeur en 0 dans la boîte de dialogue qui s’affiche.

0
Daniel Lefebvre