MySQL에서는 하나의 테이블 안에서 두 개 이상의 필드에 대해 FOREIGN KEY(외래 키) 제약 조건을 추가할 수 있습니다. 다만 반드시 지켜야 할 조건이 있는데, 바로 자식 테이블의 각 외래 키는 서로 다른 부모 테이블을 참조해야 한다는 점입니다. 즉, 여러 외래 키가 동일한 부모 테이블을 중복 참조하는 구조가 아니라, 각 외래 키가 고유한 부모 테이블과 연결되어야 합니다.
예시를 통한 이해
1. 부모 테이블 확인하기
'cust_unq_id' 필드에 PRIMARY KEY 제약 조건이 설정된 'customer2' 테이블이 있다고 가정해 보겠습니다.
mysql> describe customer2; +-------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+-------+ | cust_id | int(11) | YES | | NULL | | | First_name | varchar(20) | YES | | NULL | | | Last_name | varchar(20) | YES | | NULL | | | City | varchar(10) | YES | | NULL | | | cust_unq_id | int(11) | NO | PRI | 0 | | +-------------+-------------+------+-----+---------+-------+ 5 rows in set (0.06 sec)
2. 기존 외래 키가 설정된 자식 테이블
다음은 'orders1' 테이블입니다. 이 테이블에는 이미 'Cust_id' 필드에 부모 테이블 'customer'를 참조하는 FOREIGN KEY 제약 조건이 걸려 있습니다. describe 결과에서 'Cust_id' 필드의 Key 값이 MUL로 표시되는 것이 그 증거입니다.
mysql> describe orders1; +--------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+-------+ | order_id | int(11) | NO | PRI | NULL | | | Product_name | varchar(25) | YES | | NULL | | | orderdate | date | YES | | NULL | | | Cust_id | int(11) | YES | MUL | NULL | | | cust_unq_id | int(11) | YES | | NULL | | +--------------+-------------+------+-----+---------+-------+ 5 rows in set (0.04 sec)
3. ALTER TABLE 문으로 두 번째 외래 키 추가하기
이제 아래의 ALTER TABLE 쿼리를 실행하면 'cust_unq_id' 필드에 부모 테이블 'customer2'를 참조하는 또 다른 외래 키 제약 조건을 손쉽게 추가할 수 있습니다.
mysql> Alter table orders1 add FOREIGN KEY(cust_unq_id) REFERENCES Customer2(Cust_unq_id); Query OK, 0 rows affected (0.25 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> describe orders1; +--------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+------+-----+---------+-------+ | order_id | int(11) | NO | PRI | NULL | | | Product_name | varchar(25) | YES | | NULL | | | orderdate | date | YES | | NULL | | | Cust_id | int(11) | YES | MUL | NULL | | | cust_unq_id | int(11) | YES | MUL | NULL | | +--------------+-------------+------+-----+---------+-------+ 5 rows in set (0.06 sec)
결과 확인
위 결과 집합을 살펴보면 'orders1' 테이블에서 'Cust_id'와 'cust_unq_id' 두 필드 모두 Key 열에 MUL로 표시된 것을 확인할 수 있습니다. 이는 해당 테이블에 총 두 개의 외래 키 제약 조건, 즉 'cust_id'에 하나와 'cust_unq_id'에 하나가 각각 성공적으로 설정되었음을 의미합니다.
참고로 describe 출력에서 MUL은 해당 필드가 인덱스의 첫 번째 열이면서 유니크하지 않은 값, 즉 외래 키처럼 중복 값을 허용하는 키임을 나타냅니다. 이처럼 ALTER TABLE 문을 활용하면 기존 테이블을 삭제하거나 재생성하지 않고도 필요한 만큼 외래 키 제약 조건을 유연하게 추가할 수 있습니다.