SQLiteのリセット主キーフィールド


118

SQLiteにいくつかのテーブルがあり、自動インクリメントデータベースフィールドをリセットする方法を理解しようとしています。

私は読んでDELETE FROM tablenameすべてのものを削除しに自動incremementフィールドバックをリセットする必要があります0が、私はこれを行うとき、それだけでデータが削除されます。新しいレコードが挿入されると、自動インクリメントは削除前に中断されたところから再開します。

私のidentフィールドプロパティは次のとおりです。

  • フィールドタイプinteger
  • フィールドフラグPRIMARY KEYAUTOINCREMENTUNIQUE

SQLite MaestroでテーブルをDELETE作成し、SQLite Maestro でもステートメントを実行することは重要ですか?

どんな助けでも素晴らしいでしょう。

回答:


244

これを試して:

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

SQLite自動インクリメント

SQLiteは、特別なSQLITE_SEQUENCEテーブルを使用してテーブルが保持した最大のROWIDを追跡しますSQLITE_SEQUENCEAUTOINCREMENTカラムを含む通常の テーブルが作成されると、テーブルは自動的に作成および初期化されます。SQLITE_SEQUENCEテーブルの内容は、通常のUPDATE、INSERT、DELETEステートメントを使用して変更できます。ただし、このテーブルを変更すると、AUTOINCREMENTキー生成アルゴリズムが混乱する可能性があります。このような変更を行う前に、自分が何をしているかを確認してください。


9
ほんの小さな補足:where句のテーブル名では大文字と小文字が区別されます
321X 2011

5
別の方法は、sqlite_sequenceテーブルを更新することです。update sqlite_sequence set seq = 0 where name = '<tablename>'これは、sqlite_sequenceテーブルのROWIDをリセットしません。
バイナリ

@binary、別の方法について言及してくれてありがとう:) SQLiteは「削除された」スペースを再利用するので、どのソリューションを選択しても大きな違いはありません。
Nick Dandoulakis

1
SQLiteは、自動インクリメント列を定義するときにのみsqlite_sequenceテーブルを作成することに注意してください。それまでは存在しませんでした。
ザカリーイェーツ2014年

@ZacharyYates、確かに、それは引用テキストですでに言及されています。
Nick Dandoulakis 2014年

48

あなたのテーブルの行を削除した後、更新シーケンスでリセットできます

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';

部屋でこれを行う方法を教えてもらえますか?
Psycho

@Psychoはどういう意味ですか?私は:)を理解することはできません
フイン・ゴック・バン

実際、私はルームデータベースでこれを行う方法を尋ねていました.....問題は今のところ解決されています
Psycho

@Psychoでは、Roomデータベースを使用してこれをどのように使用したか教えていただけますか?
プラカシュプン

1

代替オプションとして、Sqliteデータベースブラウザーを使用していて、GUIソリューションに傾倒している場合は、フィールド名がテーブルの名前であるsqlite_sequenceテーブルを編集できます。フィールドseqのセルをダブルクリックし、ポップアップダイアログボックスで値を0に変更します。


0

コンテンツプロバイダーを介してすべてのRowIdをリセットしたい場合は、これを試してください

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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.