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는 특수 SQLITE_SEQUENCE테이블을 사용하여 테이블이 보유한 가장 큰 ROWID를 추적 합니다 . SQLITE_SEQUENCE테이블 생성 및 자동 증가 열을 포함하는 통상의 테이블이 생성 될 때마다 자동으로 초기화된다. SQLITE_SEQUENCE 테이블의 내용은 일반 UPDATE, INSERT 및 DELETE 문을 사용하여 수정할 수 있습니다. 그러나이 테이블을 수정하면 AUTOINCREMENT 키 생성 알고리즘이 교란 될 수 있습니다. 그러한 변경을 수행하기 전에 무엇을하고 있는지 확인하십시오.


9
작은 참고 사항 : where 절의 테이블 이름은 대소 문자를 구분합니다
321X

5
또 다른 방법은 sqlite_sequence 테이블을 업데이트하는 것입니다. update sqlite_sequence set seq = 0 where name = '<tablename>'이것은 sqlite_sequence 테이블의 rowid를 재설정하지 않습니다.
바이너리

@binary, 대체 방법을 언급 해주셔서 감사합니다. :) SQLite는 "삭제 된"공간을 재사용하므로 우리가 어떤 솔루션을 선택할지는 실제로 큰 차이를 만들지 않습니다.
Nick Dandoulakis 2012 년

1
SQLite는 자동 증가 열을 정의 할 때만 sqlite_sequence 테이블을 생성합니다. 그 전에는 존재하지 않았습니다.
Zachary Yates

@ZacharyYates, 실제로 인용 된 텍스트에 이미 언급되어 있습니다.
Nick Dandoulakis 2014-06-11

48

테이블에서 행을 삭제 한 후 업데이트 순서로 재설정 할 수 있습니다.

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

방에서 이걸 어떻게하는지 말해 줄래?
사이코

@Psycho는 무엇을 의미합니까? 나는 :) 이해할 수 없다
후인 옥 플레이를

사실 저는 Room Database에서 어떻게해야하는지 묻고 있었는데 .....
Psycho

@Psycho는 Room 데이터베이스를 사용하여 이것을 어떻게 사용했는지 말해 줄 수 있습니까?
prakashpun

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.