[MySQL] 6장 외래 키(Foreign Key)

1. 외래 키(Foreign Key)

MySQL에 외래 키는 데이터베이스의 두 테이블 간의 관계를 정의하는 데 사용하며, 한 테이블 열의 다른 테이블의 키본 키(Primary Key)를 참조하도록 설정하여 데이터 무결성을 유지합니다. 외래 키의 개념은 다음과 같습니다.

  • 정의: 외래 키는 한 테이블의 컬럼이 다른 테이블의 기본 키를 참조해 두 테이블 간의 관계를 설정하는 데 사용
  • 용도: 데이터의 무결성을 보장하며, 두 테이블 간의 연관성을 유지
  • 예) 고객 테이블과 주문 테이블이 있을 때, 주문 테이블의 고객 ID 컬럼은 고객 테이블의 기본 키를 외래 키로 참조

2. 외래 키 설정하기

외래 키는 테이블을 생성할 때 또는 기존 테이블에 추가할 때 설정할 수 있습니다.

-- 테이블 생성 시 외래 키 설정
CREATE TABLE customers (
   customer_id INT AUTO_INCREMENT PRIMARY KEY,
   name VARCHAR(100) NOT NULL
);

CREATE TABLE orders_list (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE NOT NULL, 
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
)


위의 예에서 orders 테이블의 customer_id 컬럼은 custormers 테이블의 customer_id 컬럼을 참조하는 외래 키입니다. 기존 테이블에 외래 키를 추가하려면 ALTER TABLE 명령어를 사용합니다.

-- 기존 테이블에 외래키 추가
ALTER TABLE orders_list
ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id);

3. 외래 키의 제약 조건

외래 키에는 다음과 같은 제약 조건을 설정할 수 있습니다.

  • ON DELETE: 참조된 데이터가 삭제될 떄 동작을 정의
    • CASCADE: 참조된 행이 삭제되면 관련된 모든 행도 삭제
    • SET NULL: 참조된 행이 삭제되면 외래 키 값이 NULL 로 설정
    • NO ACTION: 참조된 행이 삭제되면 오류가 발생
  • ON UPDATE: 참조된 데이터가 변경될 때 동작을 정의
    • CASCADE: 참조된 행이 업데이트되면 관련된 모든 행도 업데이트
    • SET NULL: 참조된 행이 업데이트되면 외래 키 값이 NULL 로 설정
    • NO ACTION: 참조된 행이 업데이트되면 오류가 발생
CREATE TABLE constrains (
   order_id INT AUTO_INCREMENT PRIMARY KEY,
   order_date DATE NOT NULL,
   customer_id INT,
   FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
   ON DELETE CASCADE
   ON UPDATE CASCADE
);

4. 외래 키 확인

현재 데이터베이스의 외래 키 제약 조건을 확인하려면 다음의 SQL 명령어를 사용합니다.

SHOW CREATE TABLE constrains;

 

이 명령어는 orders 테이블의 생성 SQL을 보여주며, 외래 키 정보도 포함됩니다.


5. 외래 키 삭제

외래 키를 삭제하려면 ALTER TABLE 명령어를 사용해 삭제합니다.

ALTER TABLE orders_list
DROP FOREIGN KEY fk_customer;
 
// 외래 키 확인
SHOW CREATE TABLE orders_list;

요약

  • 외래 키는 두 테이블 간 관계를 설정해 데이터의 무결성을 유지하는 데 사용
  • 외래 키는 테이블 생성 시 또는 기존 테이블에 추가할 수 있음
  • 외래 키는 삭제 및 업데이트 시 동작을 제어하는 다양한 제약조건을 설정

 

 

GitHub - Koras02/mysql-bloging

Contribute to Koras02/mysql-bloging development by creating an account on GitHub.

github.com

 

LIST

'Back-End > MySQL' 카테고리의 다른 글

[MySQL] 8장(완) - MySQL 인덱스  (0) 2025.03.09
[MySQL] 7장 주요 SQL(Structured Query Language)  (0) 2025.03.08
[MySQL] 5장 기본 키(Primary Key)  (0) 2025.03.02
[MySQL] 4장 레코드  (0) 2025.02.27
[MySQL] 3장. MySQL 테이블  (0) 2025.02.26