SQLite Réinitialiser Le Champ De Clé Primaire

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 DELETE FROM tablename devrait tout supprimer et réinitialiser le champ d'incrémentation automatique à 0, mais quand je fais cela, il supprime simplement les données. Lorsqu'un nouvel enregistrement est inséré, l'auto-incrémentation reprend là où elle s'était arrêtée avant la suppression.

Mes propriétés de Champ ident sont les suivantes:

  • Type De Champ: integer
  • champ Drapeaux: 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 serait géniale.

93
demandé sur ElementW 2009-10-21 19:38:48

4 réponses

, Essayez ceci:

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

SQLite Autoincrement

SQLite garde la trace des plus grands ROWID qu'une table a déjà tenu en utilisant le spécial SQLITE_SEQUENCE Tableau. Le SQLITE_SEQUENCE la table est créée et initialisé automatiquement chaque fois qu'un table normale qui contient un La colonne AUTOINCREMENT est créée. Le contenu de la table SQLITE_SEQUENCE peut être modifié en utilisant la mise à jour ordinaire, Insérer et supprimer des instructions. Mais apporter des modifications à ce tableau va probablement perturber L'AUTOINCREMENT algorithme de génération de clés. Assurer tu sais ce que tu fais devant toi entreprendre de tels changements.

192
répondu Nick Dandoulakis 2009-10-21 16:03:33

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';
26
répondu Huỳnh Ngọc Bang 2015-04-09 02:54:27

Comme option alternative, si vous avez le 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.

0
répondu Daniel Lefebvre 2013-11-09 16:33:39

Si vous voulez 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);
}
0
répondu UmAnusorn 2013-12-18 10:55:19