2012-05-23 3 views
2

sqlite 데이터베이스가 삽입 된 모든 레코드에 대해 고유 한 ID (자동 증가)를 자동으로 생성한다는 것을 알고 있습니다.sqlite 데이터베이스에서 고유 ID가 부족함

대체 쿼리를 실행하는 동안 sqlite3 데이터베이스에서 시스템 고유 ID가 부족할 가능성이 있는지 알고 있습니까?

데이터베이스의 모든 데이터에는 고유 한 유형이 있음을 의미합니다. 예를 들어 시스템 고유 ID는 int와 같습니다. MAX_INT와 같은 고유 ID를 생성하는 경우 데이터베이스에서 다음 레코드로 수행 할 작업은 무엇입니까?

감사합니다.

답변

7

가능한 최대 ID는 9223372036854775807 (2^63-1)입니다. 어쨌든 새로운 자동 증가 기본 키를 찾을 수 없으면 SQLITE_FULL을 반환합니다.

다른 중요한 점도 하나 있습니다. INTEGER PRIMARY KEY를 사용하면 이전에 표에 있었지만 삭제 된 키를 재사용 할 수 있습니다. INTEGER PRIMARY KEY AUTOINCREMENT를 사용하면 절대로 자동 증가 키를 재사용 할 수 없습니다.

+0

알겠습니다. 내가 볼 수 있듯이 - 나는이 ROWID를 소유하지 않습니다. 내가 문서에서 읽은 것처럼 : 정수 자동 증가 열이 있으면이 테이블의 ROWID 별칭이되며 ROWID 또한 자동 증가됩니다. 자동 증가 열 (기본 키 정수)이없는 경우 - ROWID는 기본 키 정수가됩니다. 하지만 내 테이블에는 정수 기본 키가 없습니다. 어떤 유형의 키가 ROWID입니까? 자동 증가겠습니까? 많은 감사 –

+0

@ msj, INTEGER PRIMARY KEY를 명시 적으로 선언하지 않으면 최상위 알고리즘을 사용합니다 (http://www.sqlite.org/autoinc.html). 그러나'ROWID'를 통해서만 접근 할 수 있습니다. –

+0

나는 또한 믿고 싶다. 답변 주셔서 감사합니다. –

6

http://www.sqlite.org/autoinc.html

가장 큰 ROWID가 가능한 최대의 정수 (9223372036854775807) 다음 데이터베이스 엔진은 이전에 사용되지 않는 하나를 찾을 때까지 무작위로 양 후보의 ROWID를 따기 시작과 동일합니다. "경우 미사용 ROWID 수 SQLite_FULL 오류로 삽입 작업이 실패하고 명시 적으로 음수 ROWID 값을 삽입하지 않으면 자동으로 생성 된 ROWID 값은 항상 0보다 큽니다. "

sqlite ids가 64 비트라면 다음 546 년 동안 100 밀리 초마다 새 레코드를 삽입 할 수 있습니다 (그 숫자를 만들었지 만 아이디어를 얻을 수 있습니다).

+3

실제로는 2.92277266 × 10^10 년 ([100 ms * 9223372036854775807 년] (https://www.google.com/search?q=100%20ms%20*%209223372036854775807%20in%20years))입니다. –

관련 문제