2010-06-17 2 views
1

최근 Django 프로젝트 뒤에 데이터베이스의 SQL 덤프를 만들었습니다. SQL을 정리 한 후 DB와 모든 데이터를 복원 할 수있었습니다. 문제는 시퀀스가 ​​모두 망쳐 버렸다는 것입니다. 새로운 사용자를 추가하고 파이썬 오류 IntegrityError: duplicate key violates unique constraint을 생성했습니다.Postgresql 덤프는 마지막 키 또는 그 이후에 시작하는 시퀀스를 생성합니까?

필자는 당연히 SQL 덤프가 시퀀스를 다시 시작하지 않는다고 생각했습니다. 그러나이 한 :

DROP SEQUENCE "auth_user_id_seq" CASCADE; 
CREATE SEQUENCE "auth_user_id_seq" INCREMENT 1 START 446 MAXVALUE 9223372036854775807 MINVALUE 1 CACHE 1; 
ALTER TABLE "auth_user_id_seq" OWNER TO "db_user"; 

내가 알아 낸 그 성공 객체/행 생성 허용 (기존 데이터와 같은 순서로 모든 테이블 또는 새로운 행) 사용자를 생성에서 반복 시도. 이로 인해 긴급한 문제가 해결되었습니다.

하지만 그 테이블의 마지막 사용자 ID가 446 인 경우 - 위의 시퀀스 생성에서 같은 시작 값 - Postgresql이 단순히 해당 키가있는 행을 만들기 시작한 것처럼 보입니다.

SQL 덤프가 잘못된 시작 키를 1 씩 제공합니까? 또는 주어진 시작 ID 다음에 시퀀스를 시작하기 위해 다른 명령을 호출해야합니까? 킨이 궁금해.

+0

추가 질문 추가 : http://stackoverflow.com/questions/3168187/django-orm-misreading-postgresql-sequences – bennylope

답변

3

덤프가 문제 없습니다. 코드 (또는 열의 기본값)가 nextval()을 사용하여 시퀀스의 다음 값을 얻으면 모든 것이 잘됩니다. 코드를 확인하고 SQL이 실행되는 내용, 실행되는 SQL을 확인하십시오. 이 정보를 통해 왜 일이 잘못되는지 알 수 있습니다.

행운을 빈다.

+0

+1 PostgreSQL은이 시나리오에 아무런 문제가 없습니다. 테이블의 마지막 ID가 현재 시퀀스 값보다 크지 않은지 수동으로 확인할 수 있습니다. – leonbloy

+0

나는 이것을 'clear'로 강요 할 수 있다고 가정하고 장고 문제가 아니라 Postgresql 문제임을 나타낸다. (add'l 태그 추가) – bennylope

+0

Postgres 측에 오류가 있다는 생각으로 돌아 왔습니다. DB를 다시 덤프하고 복원 한 후에도 장고에서 같은 문제를 발견했습니다. 이번에는 한 시퀀스에서 nextval을 선택하고 해당 필드에서 최대 ID의 현재 값을 얻었습니다. nextval()에 대한 후속 호출 (예 : 'SELECT nextval ('sequence');'시퀀스를 증가 시켰습니다. 초기 전화는 그렇지 않습니다. 그게 Postgres 8.1에서 오류가 아니라면 확실히 나에게 예기치 않은 행동입니다! 이 답변에 의해 참조 http://stackoverflow.com/questions/3168187/django-orm-misreading-postgresql-sequences/3176972#3176972 – bennylope

관련 문제