다른 테이블의 행을 가리키는 약속
외래 키는 이 열의 값이 다른 테이블에 실제로 존재해야 한다고 선언해. PostgreSQL은 INSERT와 UPDATE 때마다 확인하므로, 존재하지 않는 고객을 가리키는 주문 같은 고아 데이터가 생기지 않아.
삭제할 때의 네 가지 선택
- RESTRICT 또는 NO ACTION은 참조하는 행이 있으면 부모 삭제를 막아.
- CASCADE는 부모와 함께 소유된 자식도 지워. 주문과 주문 항목처럼 생명 주기가 묶인 관계에 써.
- SET NULL은 부모가 사라져도 자식은 남기고 외래 키만 비워. 열이 NULL을 허용해야 해.
SET DEFAULT는 미리 정한 기본값으로 바꾸며, 그 값 역시 유효한 참조여야 해.
갱신 규칙도 따로 정할 수 있어
ON UPDATE는 부모 키가 바뀔 때 자식 키를 어떻게 다룰지 정해. 안정적인 대리 키는 애초에 바뀌지 않게 설계하는 편이 낫지만 자연 키를 쓴다면 동작을 명시해야 해. 외래 키 자체가 참조하는 쪽의 색인을 자동으로 만들어 주지는 않는다는 점도 기억해.