2016-08-04 2 views
2

장고에 Booking 모델이 있고 그 ID는 장고가 생성하는 빌드 id 열입니다. 여기가 포스트 그레스에 데이터베이스 수준에서 보이는 방법은 다음과 같습니다왜 모델 ID가 항상 Postgres/Django의 다음 증분 번호가 아닌가요?

integer not null default nextval('bookings_booking_id_seq'::regclass) 

클라이언트는 오늘이 숫자가 순차적 것 같다하지만 항상 연속 아니라는 것을 걱정 호출했다. 예를 들어, 순서는 다음과 같습니다 :

..2, ..3, ..4, ..6, ..8, ..9 

그들은 시스템이 예약을 삭제하거나 삭제할 우려가 있습니다. ..5..7은 어디에 있습니까? [실질적으로] 으로 예약을 삭제할 수 있으므로 시스템 문제가 아닙니다. 프로그래머의 직감은 Auto-ID에서 연속성을 기대하지 말라고 가르쳐 줬지만 직감만으로는 클라이언트에게 설명하기에 충분하지 않습니다.

Postgres가이 ID를 할당 할 때 숫자를 건너 뛰는 기술적 인 이유가 있습니까? postgres docs 가입일

+2

트랜잭션이 롤백 될 때 시퀀스에 * holes *이있을 수 있습니다. 기술적 인 이유는 시퀀스가 ​​lockfree (그렇지 않으면 locking-hotspot 또는 funnel이 될 수 있습니다)입니다. – joop

답변

4

:

때문에 smallserial 직렬 및 행이없는 경우에도, 컬럼에 나타나는 값들의 시퀀스에서 "홀"또는 갭이있을 수있다 시퀀스를 사용 BIGSERIAL 구현 이제까지 지워졌습니다. 해당 값을 포함하는 행이 테이블 열에 성공적으로 삽입되지 않더라도 시퀀스에서 할당 된 값은 여전히 ​​"사용되지 않음"입니다. 예를 들어, 삽입 트랜잭션이 롤백되는 경우에 이런 일이 발생할 수 있습니다. 자세한 내용은 9.16 절의 nextval()을 참조하십시오.

또한 nextval

용 문서에서 동일한 시퀀스 번호로부터 획득 동시 트랜잭션을 막지 않도록, 롤백 적이있는 NEXTVAL 동작; 즉, 값을 가져 오면 사용 된 것으로 간주되어 다시 반환되지 않습니다. 주변 트랜잭션이 나중에 중단되거나 호출 쿼리가 값을 사용하지 않는 경우에도 마찬가지입니다. 예를 들어 ON CONFLICT 절이있는 INSERT는 ON CONFLICT 규칙을 따르는 충돌을 검색하기 전에 필요한 nextval 호출을 포함하여 삽입 할 튜플을 계산합니다. 이러한 경우에는 할당 된 값의 순서에 사용되지 않은 "구멍"이 남습니다. 따라서 PostgreSQL 시퀀스 객체는 "gapless"시퀀스를 얻는 데 사용할 수 없습니다.