2010-06-21 11 views
0

postgresql 시퀀스에 관한 질문이 있습니다.postgresql 시퀀스에 관한 질문

예를 들어, bigserial 데이터 유형의 경우, 시퀀스가 ​​진행되고 숫자가 검색되며 삽입/커밋이 성공적이지 않은 경우에도 시퀀스는 역 추적하지 않습니다. 다음에 제가 테이블에 삽입을 할 때 시퀀스 번호의 틈이 생길 수 있음을 의미합니다.

내 테이블에 행 삽입 트리거가 있고 psycopg2를 사용하는 Im입니다.

미리 감사드립니다.

답변

4

삽입이/커밋이 성공하지 경우에도 순서가되지 역 추적을 수행합니다. 다음에 제가 테이블에 삽입을 할 때 시퀀스 번호의 틈이 생길 수 있음을 의미합니다.

예, 그렇습니다. 대개 시퀀스가 ​​고유하고 (일반적으로 PK 인 경우) 이고 간격이 전혀 중요하지 않은 테이블의 값을 가져 오기를 원합니다.

궁금한 점이 있다면 : 동시성에 대해 생각하면 자연스러운 동작입니다. 트랜잭션 T1이 한 행을 삽입하고, 시퀀스에서 PK1을 가져오고, 다른 테이블의 다른 레코드를 빌드하기 위해 그 값을 사용한다고 가정합니다. (T1 커밋 이전에) 다른 트랜잭션 T2는 같은 테이블에 행을 삽입합니다. 그렇다면 T1 롤백과 T2 커밋 ...

BTW : "틈새가 적은"시퀀스를 원할 경우 ... 먼저 정말로 자신이 원하는 것인지 물어보십시오 (일반적으로 실제로는 필요하지 않습니다. 귀하의 디자인에 개념적 문제) ...하지만 당신이 정말로 필요하면 this을 읽을 수 있습니다.

+2

위의 계속 : 대리 키의 "간격"에 대해 실제로 걱정하지 않아도됩니다. 이렇게 (내 경험에) 충분히 불투명하지 대리모를 나타냅니다. 그리고 시퀀스에 이르기까지 단조롭게 (리셋하지 않는 한) 증가가 보장됩니다 ... –

+1

심지어 불필요한 숫자 여야합니다. –

+0

맞습니다. 설명 해줘서 고마워. – goh

3

역 추적은 완료 될 때까지 잠금이 필요합니다. 이는 특히 10 개의 테이블이 모두 동일한 시퀀스를 사용할 수있을 때 좋지 않습니다. 순서를 사용하지 않으려면 row_number()과 같은 창 함수를 사용하십시오.

+0

도움에 감사드립니다. – goh