2010-03-25 1 views
1

2 시퀀스를 Postgres에서 동기화 된 상태로 유지하는 방법이 있습니까?Postgresql : 2 시퀀스를 동기화 된 상태로 유지

내가 만약 내가 말 :

table_A_id_seq = 1 
table_B_id_seq = 1 

을 나는 table_B_id_seqtable_A_id_seq

의 동일한 값을 소요 할 내가 SELECT nextval('table_A_id_seq'::regclass)

을 실행하고 분명히 다른 측면에서 동일해야합니다 경우 .

내가 장고에있는 몇 가지 제약 조건을 해킹해야하기 때문에 2 가지 시퀀스가 ​​필요하다. (그리고 나는 거기에서 해결할 수 없다).

+0

시퀀스를 쓸 때 하나의 시퀀스 값 = 다른 시퀀스 값을 가질 수 있습니까? –

답변

1

두 테이블은 어떤 방식 으로든 관련되어야합니까? 순서를 포함하는 조회 테이블에 그 관계를 캡슐화 한 다음 조회 테이블을 사용하는보기로 처리 할 것으로 예상되는 두 테이블을 대체합니다.

0

Table_B의 시퀀스를 증가시키는 코드를 실행하는 Table_AINSERT 트리거를 넣을 수 있습니다. 이제 Table_A에 새 행을 삽입 할 때마다 해당 행이 실행됩니다.

+0

작동하지 않습니다. 시퀀스는 트랜잭션에 안전하지 않습니다. 하나의 쿼리가 실패하면 하나의 시퀀스가 ​​업데이트되고 다른 시퀀스는 업데이트되지 않을 수 있습니다. 당신은 방아쇠로 이것을 할 수 없습니다. –

0

내 첫 번째 생각은 이것을 보는 이유는 무엇입니까? 이것은 조금 냄새가났다. 마치 우유가 며칠 만료 된 후에 우유처럼.

이 두 seq가 같은 값을 유지해야하는 시나리오는 무엇입니까? 무시

당신이 시도해 볼 수도 있습니다 내가 내 뱃속에 얻고 감정 "이 조금 이상한 것 같다"

가 삽입에이 작업을 수행 table_a에 트리거를 넣어. - a의 값으로 b seq를 설정하십시오.

select setval('table_b_seq',currval('table_a_seq')); 

이 접근 방식의 문제는 다른 table_a_seq를 증가 될 table_a_seq 값과 아무것도 변경됩니다 table_a으로 만 삽입 가정이다. 당신이 그걸로 살아갈 수 있다면, 그것은 정말로 hackish 한 방식으로 작동 할 것입니다. 나는 그것이 제 전화 인 경우 생산에 공개하지 않을 것입니다.

정말 필요한 경우 함수를 사용하여 table_a_seq를 증가시키는 단일 인터페이스를보다 강력하게 만들 수 있습니다. 이 함수를 통해서만 table_a_seq를 조작 할 수 있습니다. 그런 식으로 table_a_seq를 증가시킬 수있는 인터페이스가 하나 있습니다. 또한이 함수에 select setval('table_b_seq',currval('table_a_seq'));을 넣어야합니다. 그런 식으로 table_b_seq는 항상 table_a_seq와 같게 설정됩니다. 즉, 사용자에게 table_a_seq에 대한 권한을 제거하고 새 기능에 대한 권한 부여 만 부여하는 것을 의미합니다.

0

두 테이블 모두에 하나의 시퀀스 만 사용하십시오. 항상 다시 동기화하지 않으면 동기화 상태를 유지할 수 없습니다. 시퀀스는 트랜잭션에 안전하지 않으며 항상 ROLLBACK이 아닌 ROLLBACK으로 포워드합니다.

편집 : 하나의 시퀀스도 작동하지 않으므로 두 테이블에 동일한 번호가 부여되지 않습니다. 하위 쿼리를 사용하여 올바른 숫자를 얻고 단일 테이블에 대해 단일 시퀀스 만 사용하십시오. 다른 테이블은 하위 쿼리를 사용해야합니다.