외래 키

Foreign key

자식 행이 참조하는 부모 행의 존재를 데이터베이스가 확인합니다.

···
html
<div class="demo"><div class="head"><b>FOREIGN KEY</b><span>orders.customer_id</span></div><div class="stage fk"><div class="cell parent">customer 7</div><div class="wire">────→</div><div class="cell child">order 51</div></div><div class="foot"><span id="fkstatus">DELETE customer 7: blocked</span><span id="fkmark">referenced</span></div></div>
css
*{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)}.fk{justify-content:center}.parent,.child{min-width:30%}.wire{color:var(--accent);white-space:nowrap}.parent,.child{transition:.3s}
js
let n=0;function tick(){document.querySelector('.parent').classList.toggle('bad',!n);document.querySelector('.child').classList.toggle('on',!!n);document.getElementById('fkstatus').textContent=n?'order 51 references 7':'DELETE customer 7: blocked';document.getElementById('fkmark').textContent=n?'valid link':'referenced';n=1-n}tick();const t=setInterval(tick,1100);document.querySelector('.demo').onclick=()=>{clearInterval(t);tick()}

외래 키는 자식 테이블의 값이 부모 테이블의 후보 키를 참조하도록 강제합니다. 잘못된 참조를 삽입하려 할 때 데이터베이스가 거절합니다.

부모 행 삭제 때는 거부, 연쇄 삭제, 기본값 설정 등 정의한 동작이 적용됩니다. 데모는 주문이 참조 중인 고객을 지우려 할 때 거부되는 경우를 보여줍니다. 연쇄 삭제는 영향 범위를 확인하고 선택해야 합니다.

언제 쓰나

테이블 사이의 참조 무결성을 DB가 직접 보장해야 할 때 사용합니다.

페이지로 열기 ↗