티스토리 뷰

study/Mysql

MySQL foreign key

kwakjun0 2008. 11. 5. 13:11

primary key는 테이블의 레코드(열)을 유니크하게 구분짓게 해주는 특정 컬럼 지정하는 키를 말함.
foreign key는 다른 테이블의 primary key를 참조하는 키 즉, 하나의 테이블로는 만들어 질 수 없음.

예) 1번 테이블의 primary key를 2번 테이블에서 foreign key로 사용을 하고자 한다면 기본값이 foreign key를 체크하는 상태(SET FOREIGN_KEY_CHECKS = 1;)이므로 기본이 되는 1번 테이블을 먼저 생성 후 2번 테이블을 생성해야 한다.

혹시 어떠한 이유로인해 foreign key로 설정 된 2번 테이블을 1번 보다 번저 생성을 해야 할 상황이 발생한다면 foreign key를 체크하는 상태를 SET FOREIGN_KEY_CHECKS = 0; 적용하여 테이블 생성시 foreign key 체크를 하지 않게 하여야 한다.

그렇지 않을 경우 아래와 같은 에러구문이 발생한다.

  ERROR 1005 (HY000): Can't create table './database_name/table_name.frm' (errno: 150)

a_tbl, b_tbl 두개의 테이블이 있다고 하자

 

 create table a_tbl(
 user_id varchar(10) not null default'',
 user_name varchar(30) not null default'',
 primary key(`user_id`)
 ) engine=innodb;

 

 

 

 create table b_tbl(
 user_id varchar(10) not null,
 user_tel varchar(15) not null,
 primary key(`user_id`),
 constraint fk_user_id       -- 제약조건명 : fk_user_id
 foreign key (`user_id`)     -- 테이블의 필드(user_id)가 foreign key
 references a_tbl(`user_id`) -- 테이블(a_tbl)의 필드(user_id)를 참조 
 on delete cascade           -- 참조키가 삭제되면 foreign key도 삭제
 on update cascade           -- 참조키가 업데이트되면 foreign key도 업데이트
 ) engine=innodb;

 

 CASCADE : 참조키가 삭제되거나 업데이트 되면 동일하게 foreign key도 동일하게 맞춤.
 RESTRICT : 참조키 변경(삭제 혹은 업데이트)되는 것을 방지함.
 SET NULL : 참조키에 변경(삭제 혹은 업데이트) 되면 foreign key 값을 null 로 저장.
 NO ACTION : 참조키에 변경(삭제 혹은 업데이트) 되어도 아무런 동작을 하지 않음.(foreign key의 이미 없음)

 

 각 테이블에 데이터 입력를 입력하자.

 

 insert into a_tbl values('happy','hong gil dong');
 insert into a_tbl values('appleman','lee soon shin');
 insert into a_tbl values('keeper','lee myoung park');

 

+----------+-----------------+
| user_id  | user_name       |
+----------+-----------------+
| appleman | lee soon shin   |
| happy    | hong gil dong   |
| keeper   | lee myoung park |
+----------+-----------------+
3 rows in set (0.00 sec)

 

 

 

 insert into b_tbl values('happy','010-1234-5678');
 insert into b_tbl values('appleman','011-4321-8765');
 insert into b_tbl values('keeper','016-9876-5432');

 

+----------+---------------+
| user_id  | user_tel      |
+----------+---------------+
| appleman | 011-4321-8765 |
| happy    | 010-1234-5678 |
| keeper   | 016-9876-5432 |
+----------+---------------+
3 rows in set (0.00 sec)

 

 

 

 각 두테이블을 조인하자.

 mysql> select a.user_id, b.user_id, a.user_name, b.user_tel from a_tbl a join b_tbl b where a.user_id=b.user_id;
+----------+----------+-----------------+---------------+
| user_id  | user_id  | user_name       | user_tel      |
+----------+----------+-----------------+---------------+
| appleman | appleman | lee soon shin   | 011-4321-8765 |
| happy    | happy    | hong gil dong   | 010-1234-5678 |
| keeper   | keeper   | lee myoung park | 016-9876-5432 |
+----------+----------+-----------------+---------------+

 

참조키를 업데이트한 후에 확인하자.

 

 mysql> update a_tbl set user_id='sadman' where user_id='happy';
 Query OK, 1 row affected (0.00 sec)
 Rows matched: 1  Changed: 1  Warnings: 0

 

mysql> select a.user_id, b.user_id, a.user_name, b.user_tel from a_tbl a join b_tbl b where a.user_id=b.user_id;
+----------+----------+-----------------+---------------+
| user_id  | user_id  | user_name       | user_tel      |
+----------+----------+-----------------+---------------+
| appleman | appleman | lee soon shin   | 011-4321-8765 |
| keeper   | keeper   | lee myoung park | 016-9876-5432 |
| sadman   | sadman   | hong gil dong   | 010-1234-5678 |
+----------+----------+-----------------+---------------+
3 rows in set (0.00 sec)


[출처] [MySQL]MySQL foreign key 예제 (SUN MySQL 스터디) |작성자 김두형