레이블이 Foreign key인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Foreign key인 게시물을 표시합니다. 모든 게시물 표시

2009년 5월 27일 수요일

[MYSQL] ※ 이미 생성된 테이블에 PK 및 FK 제약조건 추가하기

 

※ 이미 생성된 테이블에 PK 제약조건 추가하기


ALTER TABLE [테이블명] ADD CONSTRAINT [제약조건이름] PRIMARY KEY(컬럼명);


EX) ALTER TABLE product ADD CONSTRAINT product_pdcode_pk PRIMARY KEY(pdcode);

product 라는 테이블에 product_pdcode_pk 라는 이름을 가진 PK 제약조건을 추가한다.


※ 이미 생성된 테이블에 FK 제약조건 추가하기


ALTER TABLE [테이블명] ADD CONSTRAINT [제약조건이름] FOREIGN KEY(컬럼명)

REFERENCES [부모테이블명](PK컬럼명) [ON DELETE CASCADE];


EX)
ALTER TABLE category ADD CONSTRAINT category_pcode_fk FOREIGN KEY(pcode)
REFERENCES product(pdcode) ON DELETE CASCADE;


※ 제약조건의 삭제


ALTER TABLE [테이블명] DROP CONSTRAINT [제약조건이름];


EX) ALTER TABLE product DROP CONSTRAINT product_pcode_fk;

제약조건을 삭제할 경우에는 FK 제약조건부터 먼저 삭제해준다.


※ NOT NULL 제약조건의 추가


ALTER TABLE [테이블명] MODIFY [컬럼명] [데이터타입] CONSTRAINT [제약조건이름]

NOT NULL;


EX) ALTER TABLE product MODIFY pname varchar2(20) CONSTRAINT product_pname_nn

EX) NOT NULL;

[MYSQL] 펌 - Foreign key 예제



 

MySQL foreign key 예제


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)


= 출처 =

운영자 : 김두형(www.sunmysql.co.kr)

email : beansoft@nate.com

업데이트 : 20080923