SQLite รีเซ็ตฟิลด์คีย์หลัก


118

ฉันมีตารางสองสามตารางใน SQLite และฉันกำลังพยายามหาวิธีรีเซ็ตฟิลด์ฐานข้อมูลที่เพิ่มขึ้นอัตโนมัติ

ฉันอ่านแล้วว่าDELETE FROM tablenameควรลบทุกอย่างและรีเซ็ตช่องเพิ่มอัตโนมัติกลับไป0แต่เมื่อฉันทำสิ่งนี้มันจะลบข้อมูลเท่านั้น เมื่อใส่เร็กคอร์ดใหม่การเพิ่มอัตโนมัติจะดึงขึ้นมาจากจุดที่ค้างไว้ก่อนที่จะลบ

identคุณสมบัติเขตข้อมูลของฉันมีดังนี้:

  • ประเภทฟิลด์ :integer
  • ธงสนาม : PRIMARY KEY, AUTOINCREMENT,UNIQUE

เป็นเรื่องสำคัญหรือไม่ที่ฉันสร้างตารางใน SQLite Maestro และฉันกำลังดำเนินการDELETEคำสั่งใน SQLite Maestro ด้วย

ความช่วยเหลือใด ๆ จะดีมาก

คำตอบ:


244

ลองสิ่งนี้:

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

การเพิ่มอัตโนมัติของ SQLite

SQLite ติดตาม ROWID ที่ใหญ่ที่สุดที่ตารางได้เคยจัดขึ้นโดยใช้พิเศษตาราง SQLITE_SEQUENCE SQLITE_SEQUENCEตารางถูกสร้างขึ้นและเริ่มต้นได้โดยอัตโนมัติเมื่อตารางปกติที่มีคอลัมน์ AUTOINCREMENT จะถูกสร้างขึ้น เนื้อหาของตาราง SQLITE_SEQUENCE สามารถแก้ไขได้โดยใช้คำสั่ง UPDATE, INSERT และ DELETE ธรรมดา แต่การปรับเปลี่ยนตารางนี้มีแนวโน้มที่จะรบกวนอัลกอริทึมการสร้างคีย์ AUTOINCREMENT ตรวจสอบให้แน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่ก่อนที่จะดำเนินการเปลี่ยนแปลงดังกล่าว


9
หมายเหตุด้านข้างเล็ก ๆ : ชื่อตารางที่อนุประโยคเป็นตัวพิมพ์เล็ก
321X

5
อีกวิธีหนึ่งคือการอัปเดตตาราง sqlite_sequence อัปเดต sqlite_sequence set seq = 0 โดยที่ name = '<tablename>' ซึ่งจะไม่รีเซ็ต rowid ของตาราง sqlite_sequence
ไบนารี

@binary ขอบคุณที่กล่าวถึงอีกทางเลือกหนึ่ง :) ฉันต้องการทราบว่า SQLite ใช้พื้นที่ "ลบ" ซ้ำดังนั้นจึงไม่ได้สร้างความแตกต่างมากนักว่าเราจะเลือกโซลูชันใด
Nick Dandoulakis

1
โปรดสังเกตว่า SQLite จะสร้างตาราง sqlite_sequence เมื่อคุณกำหนดคอลัมน์การเพิ่มอัตโนมัติ มันไม่มีอยู่ก่อนหน้านั้น
Zachary Yates

@ZacharyYates แน่นอน แต่ได้กล่าวไว้แล้วในข้อความที่ยกมา
Nick Dandoulakis

48

คุณสามารถรีเซ็ตตามลำดับการอัปเดตหลังจากลบแถวในตารางของคุณ

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

ช่วยบอกวิธีทำห้องให้หน่อยได้ไหม
Psycho

คุณหมายถึงอะไร @Psycho? ฉันไม่เข้าใจ :)
HuỳnhNgọc Bang

จริงๆแล้วฉันกำลังถามวิธีการทำในฐานข้อมูลห้องพัก ..... ตอนนี้ปัญหาได้รับการแก้ไขแล้ว
Psycho

@Psycho ช่วยบอกหน่อยได้ไหมว่าคุณใช้ฐานข้อมูล Room อย่างไร
prakashpun

1

เป็นทางเลือกอื่นหากคุณมี Sqlite Database Browser และมีแนวโน้มที่จะใช้โซลูชัน 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.