0Pricing
SQL Academy · 강의

FOREIGN KEY와 참조 동작

FOREIGN KEY로 테이블을 연결하고, 적절한 동작을 위해 ON DELETE CASCADE / SET NULL / RESTRICT 중에서 선택합니다.

FOREIGN KEY와 참조 동작은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

FOREIGN KEY의 역할

FOREIGN KEY는 존재하지 않는 부모를 가리키는 행을 데이터베이스가 거부하게 합니다:

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL REFERENCES users(id),
  total NUMERIC(10,2) NOT NULL
);

-- Inserting an order with user_id=999 fails if no such user exists.

FOREIGN KEY를 사용하는 이유

FK는 참조 무결성을 적용합니다:

  • 고아 행 방지
  • INSERT 시점에 애플리케이션 버그 포착
  • ER 관계도를 정확하게 유지
  • 자동 CASCADE 동작 지원

참조 작업

부모 행이 삭제되거나 UPDATE될 때 어떻게 처리해야 할까요? 다섯 가지 옵션이 있습니다:

  • NO ACTION — 오류(기본값, 지연 가능)
  • RESTRICT — 오류(지연 불가)
  • CASCADE — 자식도 함께 삭제 또는 UPDATE
  • SET NULL — 자식 FK를 NULL로 설정
  • SET DEFAULT — 자식 FK를 기본값으로 설정

ON DELETE CASCADE

"사용자가 삭제되면 사용자의 주문도 삭제합니다":

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL
    REFERENCES users(id) ON DELETE CASCADE,
  total NUMERIC(10,2) NOT NULL
);

ON DELETE SET NULL

"관리자가 삭제되면 직원은 계속 남지만 관리자 정보는 사라집니다":

CREATE TABLE employees (
  id BIGSERIAL PRIMARY KEY,
  full_name TEXT NOT NULL,
  manager_id BIGINT REFERENCES employees(id) ON DELETE SET NULL
);

기본값: RESTRICT와 유사

참조 작업을 지정하지 않으면 자식이 있는 부모를 삭제하려는 시도가 실패합니다:

ERROR:  update or delete on table "users" violates foreign key constraint "orders_user_id_fkey" on table "orders"
DETAIL:  Key (id)=(42) is still referenced from table "orders".

항상 FK 열에 인덱스를 추가하십시오

PostgreSQL은 자식 측 열에 인덱스를 자동으로 생성하지 않습니다. 인덱스를 추가하십시오. 인덱스가 없으면 부모를 삭제할 때 모든 자식 테이블을 전체 검색하게 됩니다:

CREATE INDEX orders_user_id_idx ON orders(user_id);

복합 FOREIGN KEY

복합 PRIMARY KEY를 참조합니다:

CREATE TABLE order_items (
  order_id BIGINT,
  line_no INT,
  PRIMARY KEY (order_id, line_no)
);
CREATE TABLE shipments (
  order_id BIGINT,
  line_no INT,
  FOREIGN KEY (order_id, line_no)
    REFERENCES order_items(order_id, line_no)
);

FOREIGN KEY 검사 지연하기

때로는 닭과 달걀처럼 서로 참조하는 한 쌍을 삽입해야 합니다. FK를 DEFERRABLE INITIALLY DEFERRED로 지정합니다:

ALTER TABLE orders
  ALTER CONSTRAINT orders_user_id_fkey DEFERRABLE INITIALLY DEFERRED;

BEGIN;
  INSERT INTO orders ... ;     -- FK temporarily not checked
  INSERT INTO users ... ;
COMMIT;                         -- checked here

온라인으로 FOREIGN KEY 추가하기

대형 테이블에서는 긴 잠금을 피하기 위해 NOT VALID + VALIDATE를 사용합니다:

ALTER TABLE orders
  ADD CONSTRAINT orders_user_id_fkey
  FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_id_fkey;

CASCADE를 신중하게 사용하십시오

CASCADE 삭제는 연쇄적으로 전파됩니다. 사용자를 삭제하면 주문, 결제, 감사 로그가 모두 삭제될 수 있습니다. CASCADE가 업무 의도에 맞는지 확인하십시오.

요약

FOREIGN KEY는 안전장치입니다.

  • REFERENCES와 작업을 함께 지정하여 연결과 동작을 선언합니다
  • 자식 테이블의 FK 열에 인덱스를 추가합니다
  • 온라인으로 추가할 때 NOT VALID + VALIDATE를 사용합니다

빠른 확인

부모 사용자가 삭제될 때 해당 주문을 AUTOMATICALLY 삭제하려면 올바른 참조 작업은 무엇입니까?

자주 묻는 질문

“FOREIGN KEY와 참조 동작” 강의는 무료인가요?

네 — “FOREIGN KEY와 참조 동작” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“FOREIGN KEY와 참조 동작”에서 뭘 배우나요?

FOREIGN KEY로 테이블을 연결하고, 적절한 동작을 위해 ON DELETE CASCADE / SET NULL / RESTRICT 중에서 선택합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“FOREIGN KEY와 참조 동작” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. NOT NULL과 CHECK 제약 조건
  2. UNIQUE 제약 조건과 복합 키
  3. FOREIGN KEY와 참조 동작
  4. DEFAULT 값과 생성 열
← SQL Academy(으)로 돌아가기