날짜 범위가있는 고유성 제약


15

prices다음 열이 있는 테이블을 고려하십시오 .

id         integer primary key
product_id integer -- foreign key
start_date date not null
end_date   date not null
quantity   integer
price      numeric

데이터베이스가 날짜 범위 (를 통해 where <date> BETWEEN start_date AND end_date) 의 특정 수량으로 하나의 가격 만 가질 수 있다는 규칙을 시행하기를 원합니다 .

이런 종류의 범위 기반 제약이 가능한가?

답변:


23

예, EXCLUDE제약 조건을 일반화 하는 제약 조건을 사용할 수 있습니다 UNIQUE.

ALTER TABLE prices 
  ADD CONSTRAINT unique_price_per_product_quantity_daterange
    EXCLUDE  USING gist
    ( product_id WITH =, 
      quantity WITH =, 
      daterange(start_date, end_date, '[]') WITH &&   -- this is the crucial
    );

제약 조건은 다음과 같이 해석 될 수 있습니다.

날짜 범위가 product_id동일 quantity하고 겹치는 ( &&) 두 행을 허용하지 않습니다 .

'[]'(가) (기본값은 모든 것을 포함하는 날짜 범위를 원하는위한 [)다양한 유형).

범위 유형 에 대한 제약 조건에 대한 설명서를 참조하십시오 . 또한 실행하여 확장을 추가해야 할 수도 있습니다 (이를 설치하려는 각 데이터베이스마다 한 번씩).

CREATE EXTENSION btree_gist;

대단해. 난 안 할 생각 daterange이다 정확하게 는 독점 하한 이후 같은,하지만 수정에 쉽습니다. daterange열 유형 을 사용하도록 데이터를 실제로 마이그레이션해야합니까 (더 나은 경우 별도의 질문을 만들 수 있습니까) 아니면이 두 열이 합리적인가요?
스파이크

내가 잘 기억한다면 포괄적 인 하한 및 독점 상한의 기본값입니다. 모든 것을 포함하여 편집하겠습니다. 나는 일반적으로 호텔과 같은 응용 프로그램에서 일반적이므로 기본값을 선호합니다. (나는 2 일에 호텔에
타요

나는 실제로 어느 유형인지 뒤집을 수 있습니다 ... 오늘 범위 유형에 대해 알게되었고 문서를 읽고 있습니다!
스파이크

2 열 또는 날짜 범위가 바람직한 것이 무엇인지 잘 모르겠습니다. 별도의 질문을 할 수 있습니다. 원하는 사용법, 쿼리, 사용 편의성 및 인덱스 요구 사항에 따라 달라질 수 있습니다. 별도의 열이 있으면 예를 들어에 대한 색인을 갖는 것이 더 쉽습니다 (product_id, start_date). (product_id, lower(range_column))
날짜 범위
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.