[SQL] PostgreSQL의 배제에 함께 인접한 / 중첩 항목 예방
SQLPostgreSQL의 배제에 함께 인접한 / 중첩 항목 예방
나는 상점의 PostgreSQL 9.2.4 날짜 / 시간 범위를 임의의 데이터베이스를 만드는 오전. I 날짜 / 시간 범위가 겹치지, 비 인접하도록 강제이 데이터베이스에 제한을 두려는 (범위 인접한 두 번의 연속적인 범위로 표현 될 수 있기 때문에).
이를 위해, 나는이 요지 인덱스 제약 조건을 배제 사용하고 있습니다. 여기에 내가 현재 가지고있는 제약 조건은 다음과 같습니다
ADD CONSTRAINT overlap_exclude EXCLUDE USING GIST (
box(
point (
extract(EPOCH FROM "from") - 1,
extract(EPOCH FROM "from") - 1
),
point (
extract(EPOCH FROM "to"),
extract(EPOCH FROM "to")
)
) WITH &&
);
및 TIME ZONE없이 모두 TIMESTAMP, 그리고 날짜 / UTC에 저장 시간 (내 응용 프로그램에서이 컬럼에 데이터를 삽입하기 전에 UTC로 변환하고, 나는 "UTC"내 데이터베이스의 시간대 설정을 가지고는 postgresql.conf에서에서 열 ).
내가있을 수 있습니다 생각하고 문제는, 그러나,이 제약 1 초보다 작은 시간 단위가없는 것을 (잘못된) 가정을하고 있다는 것입니다.
내가 저장하고있는 특정 데이터를 들면, 나는 단지 두 번째 해상도를 필요, 저것을 주목할 필요가있다. 그러나, 나는 내가 여전히 SQL 유형 타임 스탬프 이후이 처리해야 할 수도 있다고 생각하고 timestamptz 1 초에 비해 모두 높은 해상도입니다.
내 질문 중 하나입니다 : 단순히 가정 초 해상도에 문제가, 내가 다루는이 제약 조건을 변경할 수있는 방법이있는 경우 즉, 내 모든 애플리케이션의 요구를 (또는 원), 또는 이후 분수 - 중 - 초 A의 강력한 방법?
해결법
-
==============================
1.다양한 유형이 포함되거나 배제 될 수있는 하부 및 상부 경계의 구성. 일반적인 사용 사례 (및 범위 유형에 대한 기본값) 낮은 포함하고 상한 제외하는 것입니다.
다양한 유형이 포함되거나 배제 될 수있는 하부 및 상부 경계의 구성. 일반적인 사용 사례 (및 범위 유형에 대한 기본값) 낮은 포함하고 상한 제외하는 것입니다.
중복되는 범위를 제외하면 분명한 것 같다. 매뉴얼에 좋은 코드 예제가있다
또한, 인접 연산자를 사용하는 다른 제외 제약 조건을 만들 - | - 인접 항목도 제외합니다. GIN 현재이 지원되지 않습니다으로 모두 GIST 인덱스를 기반으로해야합니다.
청결을 유지하기 위해, 나는)를 포함하여 낮은 및 다양한 기능을 사용하여 CHECK 제약 조건을 가진 모든 항목에 대해) 상단을 제외한 경계를 (강제 것입니다 :
CREATE TABLE tbl ( tbl_id serial PRIMARY KEY , tsr tsrange , CONSTRAINT tsr_no_overlap EXCLUDE USING gist (tsr WITH &&) , CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-) , CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr)) );
DB <> 바이올린 여기 (올드 SQL 바이올린)
불행하게도,이 논리적으로, 하나는 충분 모두 제외 제약 조건을 구현하기 위해 두 개의 동일한 GIST 인덱스를 작성합니다. 즉, (적어도 포스트 그레스 11까지) 현재 구현의 단점이 될 것으로 보인다.
-
==============================
2.당신은 9.2에서 소개 된 다양한 유형 제외 다시 작성할 수 있습니다. 더 나은 아직, 당신은 범위를 가진 두 개의 필드를 대체 할 수있다. 기본적으로 사용 사례에 금액을 예로 들어, 여기에 "범위에 제약"을 참조하십시오 :
당신은 9.2에서 소개 된 다양한 유형 제외 다시 작성할 수 있습니다. 더 나은 아직, 당신은 범위를 가진 두 개의 필드를 대체 할 수있다. 기본적으로 사용 사례에 금액을 예로 들어, 여기에 "범위에 제약"을 참조하십시오 :
http://www.postgresql.org/docs/current/static/rangetypes.html
-
==============================
3.넌 OK 존재를 고려 :
넌 OK 존재를 고려 :
select extract ('epoch' from now()) , extract ('epoch' from now()::timestamp(0))
from https://stackoverflow.com/questions/19504727/preventing-adjacent-overlapping-entries-with-exclude-in-postgresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 쉼표로 구분 된 데이터 열을 조인 (0) | 2020.04.15 |
---|---|
[SQL] 예외 : SQLException : 문자열 또는 이진 데이터는 잘립니다 (0) | 2020.04.15 |
[SQL] 날짜 시간 데이터 유형에 VARCHAR 데이터 형식의 변환이 범위를 벗어난 값 초래 (0) | 2020.04.15 |
[SQL] 왜 SQL 서버는이 오류를 던지고있다 : 열 'ID'에 NULL 값을 삽입 할 수 없습니다? (0) | 2020.04.15 |
[SQL] dataframe 기능 대 스파크 SQL 쿼리 (0) | 2020.04.15 |