기본값은 OFF야 — 직접 켜야 해
SQLite도 FK를 지원해. 그런데 예전 버전과의 호환 때문에 기본이 꺼짐이야. 그리고 connection마다 따로 켜야 해.
PRAGMA foreign_keys = ON;이게 가장 흔한 SQLite 사고야. schema는 FK 선언을 얌전히 받아주고 다이어그램도 멀쩡해 보이는데, FK를 어기는 insert가 조용히 성공해. 엔진이 검사를 안 하니까. 피파를 포함해서 SQLite를 쓰는 프레임워크는 전부 새 connection을 열 때마다 이 PRAGMA를 돌려.
Warning:
PRAGMA foreign_keys는 connection 단위지 DB 단위가 아니야. 모든 connection의 첫 statement로 넣어. connection pool을 쓴다면 connect_args나 접속 직후 콜백에서 챙겨야 해.켜고 나면 FK가 이렇게 움직여.
- parent 테이블에 짝이 없는 FK 값을 넣으려 하면 막아.
- child를 미아로 만드는 parent 삭제도 막아.
ON DELETE CASCADE같은 걸 따로 지정하지 않았다면. - 원하면 update나 delete를 타고 내려가게 만들 수도 있어. w07에서 다뤄.