SQLite Reset Bidang Kunci Utama

118

Saya memiliki beberapa tabel di SQLite dan saya mencoba mencari cara untuk mengatur ulang bidang database yang bertambah otomatis.

Saya membaca bahwa DELETE FROM tablenameseharusnya menghapus semuanya dan mengatur ulang bidang inkrememen otomatis kembali ke 0, tetapi ketika saya melakukan ini, itu hanya menghapus data. Ketika rekor baru dimasukkan, autoincrement mengambil tempat yang ditinggalkan sebelum penghapusan.

identProperti bidang saya adalah sebagai berikut:

  • Jenis Bidang :integer
  • Bidang Flags : PRIMARY KEY, AUTOINCREMENT,UNIQUE

Apakah penting saya membuat tabel di SQLite Maestro dan saya juga menjalankan DELETEpernyataan di SQLite Maestro?

Bantuan apa pun akan sangat bagus.

Nathan
sumber

Jawaban:

244

Coba ini:

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

Peningkatan Otomatis SQLite

SQLite melacak ROWID terbesar yang pernah dimiliki SQLITE_SEQUENCEtabel menggunakan tabel khusus . The SQLITE_SEQUENCEtabel dibuat dan diinisialisasi secara otomatis setiap kali tabel normal yang berisi kolom AUTOINCREMENT dibuat. Isi tabel SQLITE_SEQUENCE dapat dimodifikasi menggunakan pernyataan UPDATE, INSERT, dan DELETE biasa. Tetapi membuat modifikasi pada tabel ini kemungkinan akan mengganggu algoritma pembuatan kunci AUTOINCREMENT. Pastikan Anda mengetahui apa yang Anda lakukan sebelum melakukan perubahan tersebut.

Nick Dandoulakis
sumber
9
Sekadar catatan kecil: Nama tabel dengan klausa yang
membedakan
5
cara lain adalah memperbarui tabel sqlite_sequence. perbarui sqlite_sequence set seq = 0 di mana name = '<tablename>' Ini tidak akan mengatur ulang rowid dari tabel sqlite_sequence.
biner
@ biner, terima kasih telah menyebutkan cara alternatif :) Saya ingin mencatat bahwa SQLite menggunakan kembali ruang yang "dihapus", jadi tidak ada bedanya solusi mana yang akan kita pilih.
Nick Dandoulakis
1
Perhatikan bahwa SQLite hanya membuat tabel sqlite_sequence saat Anda menentukan kolom autoincrement. Itu tidak ada sebelum itu.
Zachary Yates
@ZacharyYates, memang, tapi itu sudah disebutkan di teks kutipan.
Nick Dandoulakis
48

Anda dapat mengatur ulang dengan urutan pembaruan setelah baris dihapus di tabel Anda

UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='table_name';
Huỳnh Ngọc Bang
sumber
dapatkah Anda memberi tahu saya bagaimana melakukan ini untuk kamar?
Psycho
apa maksudmu @Psycho? Saya tidak mengerti :)
Huỳnh Ngọc Bang
sebenarnya saya bertanya bagaimana melakukan ini di Database Kamar ..... yah masalahnya sudah terpecahkan untuk saat ini
Psycho
@Psycho dapatkah Anda memberitahu saya bagaimana Anda menggunakan ini menggunakan database Room?
prakashpun
1

Sebagai opsi alternatif, jika Anda memiliki Browser Database Sqlite dan lebih condong ke solusi GUI, Anda dapat mengedit tabel sqlite_sequence di mana nama field adalah nama tabel Anda. Klik dua kali sel untuk bidang seq dan ubah nilainya menjadi 0 di kotak dialog yang muncul.

Daniel Lefebvre
sumber
0

Jika Anda ingin menyetel ulang setiap RowId melalui penyedia konten, coba ini

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
sumber