외래 키(Foreign Key)는 참조 무결성(referential integrity)을 강제함으로써 데이터의 일관성과 무결성을 자동으로 유지하도록 도와주는 제약 조건입니다. 이는 'customer'(고객)와 'orders'(주문)라는 두 개의 테이블 예시를 통해 쉽게 이해할 수 있습니다.
부모 테이블과 자식 테이블의 관계
여기서 'customer'는 부모 테이블(parent table)이고, 'orders'는 자식 테이블(child table)입니다. 외래 키 제약 조건이 설정되어 있기 때문에 존재하지 않는 고객에 대한 주문은 생성할 수 없습니다. 아래와 같이 두 테이블에 저장된 데이터를 먼저 확인해 보겠습니다.
mysql> Select * from Customer; +----+--------+ | id | name | +----+--------+ | 1 | Gaurav | | 2 | Raman | | 3 | Harshit| | 4 | Aarav | +----+--------+ 4 rows in set (0.00 sec) mysql> Select * from orders; +-----------+-------------+------+ | order_id | product | id | +-----------+-------------+------+ | 100 | Notebook | 1 | | 110 | Pen | 1 | | 120 | Book | 2 | | 130 | Charts | 2 | +-----------+-------------+------+ 4 rows in set (0.00 sec)
외래 키 제약 조건 위반 시 발생하는 오류
이제 'customer' 테이블에 존재하지 않는 고객(id 10)에 대한 주문을 'orders' 테이블에 삽입하려고 시도해 보겠습니다. MySQL은 외래 키 제약 조건 위반을 감지하고 다음과 같은 오류를 발생시킵니다.
mysql> insert into orders values(400, 'Notebook',10); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`query`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`id`) REFERENCES `customer` (`id`))
오류 메시지의 의미
ERROR 1452는 "자식 행(child row)을 추가하거나 수정할 수 없다"는 의미로, 'orders' 테이블의 'id' 컬럼이 'customer' 테이블의 'id' 컬럼을 참조하는 외래 키 제약 조건(orders_ibfk_1)을 위반했기 때문에 발생합니다. 즉, 부모 테이블인 'customer'에 존재하지 않는 고객 번호(10)를 참조하는 주문 데이터는 허용되지 않습니다.
결론
이처럼 외래 키는 잘못된 참조를 가진 데이터가 자식 테이블에 입력되는 것을 DBMS 차원에서 자동으로 차단합니다. 따라서 두 테이블이 외래 키로 연결되어 있다면, 애플리케이션 코드에서 별도의 검증 로직을 구현하지 않아도 자식 테이블의 데이터 무결성이 항상 보장된다고 말할 수 있습니다.