PostgreSQL 18은 범위 열의 PRIMARY KEY·UNIQUE 제약에 WITHOUT OVERLAPS를 추가했습니다. 같은 자원에 겹치는 기간이 들어오지 않도록 데이터베이스가 검사할 수 있습니다.
데모에서 기존 예약과 겹치는 새 기간은 거절되고, 이어지는 기간은 허용됩니다. 구간 끝점 포함 여부와 자원 키를 정확히 모델링해야 기대한 충돌을 잡습니다.
언제 쓰나
예약·계약·요금의 유효 기간이 같은 자원에서 겹치면 안 될 때 사용합니다.
PostgreSQL 18은 겹치는 유효 기간을 키 제약으로 막을 수 있습니다.
<div class="demo"><div class="head"><b>WITHOUT OVERLAPS</b><span>room A</span></div><div class="stage timeline"><div class="axis"><div class="bar old">existing 10–12</div><div class="bar new" id="booking">11–13</div></div></div><div class="foot"><span id="bookstatus">overlap: rejected</span><span>time range</span></div></div>*{box-sizing:border-box}.demo{width:min(96vw,820px);height:min(94vh,350px);padding:clamp(8px,2vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);color:var(--fg);display:flex;flex-direction:column;gap:clamp(5px,1.5vmin,12px);font:600 clamp(12px,3.5vmin,15px)/1.25 var(--font-sans),sans-serif;overflow:hidden}.head,.foot,.row{display:flex;justify-content:space-between;align-items:center;gap:8px}.head b{color:var(--accent)}.head span,.foot,.muted{color:var(--muted)}.stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;gap:8px}.cell,.pill{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(4px,1.2vmin,9px);text-align:center}.pill{border-radius:999px}.on{border-color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 17%,var(--surface))!important;color:var(--fg)!important}.bad{border-color:#e16a5d!important;background:color-mix(in srgb,#e16a5d 18%,var(--surface))!important}.foot{font-size:clamp(12px,3vmin,14px)}.timeline{width:100%}.axis{width:100%;height:90px;position:relative;border-bottom:2px solid var(--line);background:repeating-linear-gradient(90deg,transparent 0 19%,var(--line) 20%,transparent 21% 25%)}.bar{position:absolute;height:31px;border-radius:6px;padding:7px;text-align:center;white-space:nowrap;overflow:hidden}.old{left:8%;top:6px;width:48%;background:color-mix(in srgb,var(--accent) 24%,var(--surface));border:1px solid var(--accent)}.new{left:33%;top:47px;width:47%;background:color-mix(in srgb,#e16a5d 24%,var(--surface));border:1px solid #e16a5d;transition:left .35s,width .35s}.new.ok{left:57%;width:34%;border-color:var(--accent);background:color-mix(in srgb,var(--accent) 17%,var(--surface))}let n=0;function tick(){let e=document.getElementById('booking');e.classList.toggle('ok',!!n);e.textContent=n?'12–14':'11–13';document.getElementById('bookstatus').textContent=n?'adjacent: accepted':'overlap: rejected';n=1-n}tick();const t=setInterval(tick,1250);document.querySelector('.demo').onclick=()=>{clearInterval(t);tick()}PostgreSQL 18은 범위 열의 PRIMARY KEY·UNIQUE 제약에 WITHOUT OVERLAPS를 추가했습니다. 같은 자원에 겹치는 기간이 들어오지 않도록 데이터베이스가 검사할 수 있습니다.
데모에서 기존 예약과 겹치는 새 기간은 거절되고, 이어지는 기간은 허용됩니다. 구간 끝점 포함 여부와 자원 키를 정확히 모델링해야 기대한 충돌을 잡습니다.
예약·계약·요금의 유효 기간이 같은 자원에서 겹치면 안 될 때 사용합니다.