728x90

range 2

[PostgreSQL] range 반열림 구간 [) — 인접 기간이 안 겹치는 이유

설치·접속: PostgreSQL 설치와 접속부제: 구독 기간을 [시작, 종료) 로 저장했더니 종료일과 다음 구독 시작일이 딱 붙어도 겹침 판정이 안 나야 할 때-- range 는 무조건 반열림 [) 표준형으로 정규화된다SELECT '[3,7]'::int4range AS closed, -- 7 포함 -> [3,8) '[3,7)'::int4range AS half, -- [3,7) '(3,7)'::int4range AS open; -- 3 제외 -> [4,7)-- 인접 구간은 겹치지 않는다 (경계값 공유해도)SELECT int4range(10,20) && int4range(20,30) AS overlap, -- 겹침? int4range(10,20) -..

명령어/DB 2026.07.22

[PostgreSQL] 예약 이중예약 원천봉쇄: range + EXCLUDE + btree_gist + DEFERRABLE + IDENTITY

설치·접속: PostgreSQL 설치와 접속부제: 회의실 예약 API에서 동시 요청이 겹쳐 이중예약이 가끔 뚫릴 때, 애플리케이션 락 없이 DB 제약만으로 막는다회의실 예약에서 두 요청이 거의 동시에 들어오면 이런 코드가 뚫린다.1) SELECT ... WHERE 시간대 겹침 → 0건2) INSERT 예약두 요청이 1번을 동시에 통과한 뒤 각자 2번을 INSERT하면 겹치는 예약 두 건이 들어간다. 애플리케이션 락으로 막을 수도 있지만, 여기서는 DB 제약 하나로 옮긴다. tsrange + EXCLUDE USING GIST부터 시작한다.1단계 — 단일 리소스 겹침 차단 (range + EXCLUDE)시간 구간을 tsrange로 저장하고, "겹치는(&&) 두 행은 공존할 수 없다"를 EXCLUDE USI..

명령어/DB 2026.07.21
728x90