2009-11-05 2 views
0

이 정의가있는 테이블이 있다고 가정 해 보겠습니다.PostgreSQL 데이터베이스에서 범위 중복 제한을 선언하는 방법?

range (
    id bigint primary key, 
    colourId int references colour(id), 
    smellId int references smell(id), 
    from bigint, 
    to bigint 
) 

이 테이블은 사실 엄청나게 큰 테이블의 축소 된 뷰입니다.

item (
    id bigint primary key, 
    colourId int references colour(id), 
    smellId int references smell(id), 
    CONSTRAINT item_colour_smell_unique UNIQUE (colour, smell, id) 
) 

range 테이블에서 item_colour_smell_unique 제약 조건을 변환하고 싶습니다. colourIdsmellId 열 값을 가져 오는 동안 범위 [from, to]의 겹침을 감시해야합니다.

답변

1

트리거 기반 솔루션은 본질적으로 경쟁 조건으로 인해 안전하지 않습니다. 두 개의 동시 트랜잭션이 범위가 충돌하는 행을 삽입 할 때 "격리"ACID 속성 (커밋 된 데이터 만 볼 수 있음)으로 인해 다른 충돌 행을 볼 수 없습니다.

일부 솔루션 : 삽입의 직렬화를 강제로 테이블의 명시 적 잠금과

  • 사용 절차.
  • [from, to] 범위를 [from, from + 1, ..., to-1, to]로 분할하고 각 행을 삽입하십시오. 이렇게하면 "범위"테이블에서 간단한 UNIQUE INDEX를 사용할 수 있습니다.

    PostgreSQL의 8.5

PostgreSQL의 개발자 제프 데이비스는 has been writingabout this lately 및 구현할 범위 충돌 제약

0

이 질문에 대한 답변은 충분하지 않지만 방아쇠를 사용하려는 것처럼 들릴 수 있습니다.

1

표준 "중첩"제약 조건이 없습니다. 일부 트리거에서 직접 빌드해야합니다. 그러나 이것에 대해 8.5에 대한 논의가있었습니다.

"seg"모듈도 유용 할 것입니다. 매뉴얼 참조 - 부록 F. 추가 제공 모듈

관련 문제