2012-12-13 4 views
1

데이터베이스를 연 직후 특정 테이블의 마지막 자동 증가 값을 얻으려면 어떻게합니까? 삽입 트랜잭션이 없기 때문에 last_insert_rowid()이 아닙니다. 즉, 특정 테이블에 대해 새 행을 삽입 할 때 자동 증가가 선택할 번호를 미리 알고 싶습니다.현재 자동 증가 값을 얻는 방법

답변

1

자동 증가 된 열이 정의 된 방법에 따라 다릅니다.

열 정의가 INTEGER PRIMARY KEY AUTOINCREMENT 인 경우 SQLite는 sqlite_sequence이라는 내부 테이블에서 가장 큰 ID를 유지합니다.

열 정의에 키워드 AUTOINCREMENT이 포함되어 있지 않으면 SQLite는 '일반'루틴을 사용하여 새 ID를 결정합니다. documentation에서 :

일반적인 알고리즘은 새로 생성 된 행을 삽입하기 전에 테이블에서 가장 큰 ROWID보다 하나의 큰 ROWID를 제공하는 것입니다. 테이블이 처음에 비어 있으면 1의 ROWID가 사용됩니다. 가장 큰 ROWID가 가능한 가장 큰 정수 (9223372036854775807)과 같으면 데이터베이스 엔진은 이전에 이 아닌 것을 찾을 때까지 후보 ROWID를 무작위로 선택하기 시작합니다. 알맞은 수의 시도 후에 사용되지 않은 ROWID를 찾을 수 없으면 삽입 작업이 실패하고 SQLITE_FULL 오류가 발생합니다. 음수 ROWID 값이 명시 적으로 삽입되지 않으면 자동으로 생성 된 ROWID 값은 항상 0보다 커야합니다.

나는 AUTOINCREMENT없이 열에 대해 다음 ID를 결정하는 유일한 확실한 방법은 첫째 VACUUM 데이터베이스이며, 독서 기억; 그러면 모든 ID 카운터가 해당 테이블의 가장 큰 기존 ID + 1로 재설정됩니다. 그러나 더 이상 해당 인용문을 찾을 수 없으므로 더 이상 사실이 아닐 수 있습니다. 말했다


, 나는 다른 프로세스가 동시에 데이터베이스에 쓸 수 있다는 심지어 원격 기회가 특히 slash_rick_dot 사전에 자동 증가 ID를 가져 오는 것은 나쁜 생각이다에 동의합니다.

+0

sqlite 설명서에 따르면 엔진이 값을 자동 증가 시키려면 'INTEGER'와 'PRIMARY KEY'를 설정해야합니다. 'AUTOINCREMENT'를 설정하려했지만 작동하지 않습니다. – Pablo

+0

데이터베이스에 독점적으로 액세스 할 수 있으며 다른 프로세스는 db에 액세스 할 수 없습니다. – Pablo

+0

@Pablo : 예, 키가 ROWID의 별명이 되려면 항상 'INTEGER PRIMARY KEY'여야합니다. 'AUTOINCREMENT' 키워드를 추가하면 다음 ID가 계산되는 방식 만 바뀝니다. 이는 [documentation] (http://www.sqlite.org/faq.html#q1)에 설명 된대로 작동합니다. – Martijn

1

다른 데이터베이스는 자동 증가를 다르게 구현합니다. 그러나 내가 아는 한 그들 중 누구도 당신이 묻고있는 질문에 답하지 않을 것입니다.

자동 증가 기능은 새로 추가 된 테이블 행에 대한 고유 한 ID를 작성하기위한 것입니다. 행이 아직 삽입되지 않은 경우이 기능은 ID를 생성하지 않습니다.

그리고 말이 맞습니다. 다음 자동 증가 숫자를 얻은 경우 어떻게 할 것입니까? 가능성은 삽입하지 않은 새 행의 기본 키로 지정하려는 것입니다. 그러나 ID를 얻은 시간과 행을 삽입하는 데 사용한 시간 사이에 데이터베이스에서 다른 프로세스의 행을 삽입하기 위해 해당 ID를 사용할 수있었습니다.

귀하가 선택할 수있는 것은 귀하가 직접 생성 한 ID를 관리하거나 자동 생성 식별자를 사용하기 전에 행이 삽입 될 때까지 기다리는 것입니다.

관련 문제