Trường khóa chính đặt lại SQLite


118

Tôi có một vài bảng trong SQLite và tôi đang cố gắng tìm cách đặt lại trường cơ sở dữ liệu tự động tăng dần.

Tôi đọc rằng DELETE FROM tablenamenên xóa mọi thứ và đặt lại trường tự động tăng trở lại 0, nhưng khi tôi làm điều này, nó chỉ xóa dữ liệu. Khi một bản ghi mới được chèn vào, tính năng tự động tăng sẽ bắt đầu từ nơi nó dừng lại trước khi xóa.

identThuộc tính trường của tôi như sau:

  • Loại trường :integer
  • Dòng Flags : PRIMARY KEY, AUTOINCREMENT,UNIQUE

Có vấn đề gì không khi tôi đã tạo bảng trong SQLite Maestro và tôi cũng đang thực thi DELETEcâu lệnh trong SQLite Maestro?

Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời.

Câu trả lời:


244

Thử cái này:

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

SQLite Autoincrement

SQLite theo dõi ROWID lớn nhất mà một bảng từng có bằng cách sử dụng SQLITE_SEQUENCEbảng đặc biệt . Các SQLITE_SEQUENCEbảng được tạo ra và khởi tạo tự động bất cứ khi nào một bảng bình thường có chứa một cột autoincrement được tạo ra. Nội dung của bảng SQLITE_SEQUENCE có thể được sửa đổi bằng các câu lệnh UPDATE, INSERT và DELETE thông thường. Nhưng việc sửa đổi bảng này có thể sẽ làm xáo trộn thuật toán tạo khóa AUTOINCREMENT. Đảm bảo rằng bạn biết mình đang làm gì trước khi thực hiện những thay đổi như vậy.


9
Chỉ cần một lưu ý phụ nhỏ: Tên bảng trong mệnh đề where là trường hợp nhạy cảm
321X

5
một cách khác là cập nhật bảng sqlite_sequence. update sqlite_sequence set seq = 0 where name = '<tablename>' Thao tác này sẽ không đặt lại rowid của bảng sqlite_sequence.
nhị phân

@binary, cảm ơn bạn đã đề cập đến một cách thay thế :) Tôi muốn lưu ý rằng SQLite sử dụng lại không gian "đã xóa", vì vậy nó không thực sự tạo ra nhiều sự khác biệt mà chúng tôi sẽ chọn giải pháp nào.
Nick Dandoulakis

1
Lưu ý rằng SQLite chỉ tạo bảng sqlite_sequence khi bạn xác định cột autoincrement. Nó không tồn tại trước đó.
Zachary Yates

@ZacharyYates, thực sự, nhưng nó đã được đề cập trong văn bản trích dẫn.
Nick Dandoulakis

48

Bạn có thể đặt lại bằng trình tự cập nhật sau khi xóa các hàng trong bảng của mình

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

bạn có thể cho tôi biết làm thế nào để làm điều này cho phòng?
Psycho

ý bạn là gì @Psycho? Tôi không thể hiểu :)
Huỳnh Ngọc Bang

thực sự tôi đang hỏi làm cách nào để thực hiện việc này trong Cơ sở dữ liệu phòng ..... thì vấn đề đã được giải quyết ngay bây giờ
Psycho

@Psycho bạn có thể cho tôi biết bạn đã sử dụng cái này như thế nào bằng cách sử dụng cơ sở dữ liệu Room không?
prakashpun

1

Là một tùy chọn thay thế, nếu bạn có Trình duyệt cơ sở dữ liệu Sqlite và thiên về giải pháp GUI, bạn có thể chỉnh sửa bảng sqlite_sequence trong đó tên trường là tên bảng của bạn. Bấm đúp vào ô cho trường seq và thay đổi giá trị thành 0 trong hộp thoại bật lên.


0

Nếu bạn muốn đặt lại mọi RowId thông qua nhà cung cấp nội dung, hãy thử cách này

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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.