Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 테이블의 두 개 이상 필드에 FOREIGN KEY 제약 조건 추가하는 방법

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 문을 활용하면 기존 테이블을 삭제하거나 재생성하지 않고도 필요한 만큼 외래 키 제약 조건을 유연하게 추가할 수 있습니다.