2011-12-29 2 views
3

나는 SQLite DB 파일을 가지고 있습니다. 그리고 나는 테이블에 100 개의 행을 가지고 있습니다. 내가 줄 때행을 삭제 한 후에도 SQL Lite 빈 행 ID

SELECT * FROM a WHERE rowid BETWEEN 1 AND 100 

그것은 내가 처음으로 100 개의 결과를 준다. 이제 테이블에서 처음 두 행을 지우고 실행하면

SELECT * FROM a WHERE rowid BETWEEN 1 AND 100 

내게 98 행만 제공됩니다. 검색어를 말하면

SELECT * FROM a WHERE rowid = 1 

빈 행이 있습니다. 데이터베이스가 ROWID를 다시 정렬하지 않는 것 같습니다.

도와주세요 .. SQLite가 행 ID를 다시 정렬하도록 할 방법이 있습니까?

+0

"빈 행"이란 무엇입니까? –

+0

스크린 샷을 게시 할 수 있습니까? –

+0

질문을 "mysql"으로 태그 한 이유는 무엇입니까? – Tadeck

답변

1

SQLite에서 rowid은 단지 autoincremented 값을 갖는 int 열입니다. 당신이 보장하는 유일한 것은 각각의 rowid가 그 테이블에 유일 할 것이라는 것입니다. ROWID가 순차적 일 것이라는 보장은 없으며, 모든 숫자가 사용될 것이라는 보장조차 없다! 예를 들어, INSERT가 실패하면 실패한 삽입에 사용 된 ROWID는 건너 뛰고 다시 사용되지 않습니다 (autoincrement 키워드가 명시 적으로 사용 된 경우). 그렇지 않으면 행이 삭제 된 경우 rowid는 임의의 새로 삽입 된 데이터).

순번을 자동으로 업데이트하려면 rowid 열의 고유 한 버전을 작성하고 트리거로 업데이트 된 상태로 유지해야합니다.

+0

감사하지만 빈 행을 자동으로 수정하려면 진공을 실행해야합니다. 자체 row_id를 유지 보수하는 것보다 훨씬 쉽습니다. – NoobieDude

+0

@ 제바 (Jeba) 나는 그것이 유일한 옵션이라는 것을 두려워합니다. SQLite에서는'rowid'의 동작을 변경할 수 없습니다. 즉, SQLite 소스 코드를 가져 와서 해당 기능을 추가하려고하지 않는 한. – ean5533

0

답변을 찾았습니다. 삭제할 때마다 Vacuum 쿼리를 실행해야합니다. 이렇게하면 모든 행 색인을 재정렬하고 불감 행을 제거 할 수 있습니다.

http://sqlite.org/lang_vacuum.html