SQLite Sıfırlama Birincil Anahtar Alanı


118

SQLite'de birkaç tablom var ve otomatik olarak artan veritabanı alanını nasıl sıfırlayacağımı bulmaya çalışıyorum.

Bunun DELETE FROM tablenameher şeyi silmesi ve otomatik artış alanını sıfırlaması gerektiğini okudum 0, ancak bunu yaptığımda sadece verileri siliyor . Yeni bir kayıt eklendiğinde, otomatik artış, silme işleminden önce kaldığı yerden devam eder.

Benim identşöyle alan özellikleri şunlardır:

  • Alan Türü :integer
  • Alan Bayraklar : PRIMARY KEY, AUTOINCREMENT,UNIQUE

Tabloyu SQLite Maestro'da oluşturmuş olmam ve DELETEifadeyi SQLite Maestro'da da çalıştırmam önemli mi?

Herhangi bir yardım harika olur.

Yanıtlar:


244

Bunu dene:

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

SQLite Otomatik Artırma

SQLite, özel SQLITE_SEQUENCEtabloyu kullanarak bir tablonun sahip olduğu en büyük ROWID'nin kaydını tutar . SQLITE_SEQUENCETablo oluşturulur ve AUTOINCREMENT sütun içeren normal bir tablo oluşturulduğunda otomatik olarak başlatılır. SQLITE_SEQUENCE tablosunun içeriği sıradan UPDATE, INSERT ve DELETE ifadeleri kullanılarak değiştirilebilir. Ancak bu tabloda değişiklik yapmak, AUTOINCREMENT anahtar oluşturma algoritmasını büyük olasılıkla bozacaktır. Bu tür değişiklikleri yapmadan önce ne yaptığınızı bildiğinizden emin olun.


9
Sadece küçük bir yan not: cümlenin büyük / küçük harfe duyarlı olduğu tablo adı
321X

5
başka bir yol da sqlite_sequence tablosunu güncellemektir. update sqlite_sequence set seq = 0 burada name = '<tablename>' Bu, sqlite_sequence tablosunun satır kimliğini sıfırlamaz.
ikili

@binary, alternatif bir yoldan bahsettiğin için teşekkürler :) SQLite'in "silinmiş" alanı yeniden kullandığını, bu yüzden hangi çözümü seçeceğimizin pek bir fark yaratmadığını belirtmek isterim.
Nick Dandoulakis

1
Bir otomatik artış sütunu tanımladığınızda SQLite'ın yalnızca sqlite_sequence tablosunu oluşturduğunu unutmayın. O zamandan önce yok.
Zachary Yates

@ZacharyYates, gerçekten, ama alıntı yapılan metinde zaten bahsediliyor.
Nick Dandoulakis

48

Tablonuzdaki satırları sildikten sonra güncelleyerek sıfırlayabilirsiniz.

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

bunu oda için nasıl yapacağımı söyler misin?
Psiko

@Psiko ne demek? Anlayamıyorum :)
Huỳnh Ngọc Bang

aslında bunu Oda Veritabanında nasıl yapacağımı soruyordum ..... sorun şimdilik çözüldü
Psycho

@Psycho, Room veritabanını kullanarak bunu nasıl kullandığınızı söyleyebilir misiniz?
prakashpun

1

Alternatif bir seçenek olarak, Sqlite Veritabanı Tarayıcınız varsa ve bir GUI çözümüne daha yatkınsanız, alan adının tablonuzun adı olduğu sqlite_sequence tablosunu düzenleyebilirsiniz. Seq alanı için hücreye çift tıklayın ve açılan diyalog kutusunda değeri 0 olarak değiştirin.


0

Her RowId'yi içerik sağlayıcı aracılığıyla sıfırlamak istiyorsanız, bunu deneyin

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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.