본문 바로가기
카테고리 없음

MySQL: primary key, foreign key 추가 및 삭제, constraint추가 방법.

by 질서정연_ 2020. 10. 16.

1. key의 정의. 

pk는 DB 디자이너에 의해 선택 된 candidate key를 뜻한다. 

그럼 candidate key는 뭘까?

key는 하나의 tuple을 다른 tuple로부터 구별하는 방법이다. 

예를 들어 학생의 학번이나 이메일 주소는 고유한 값이기 때문에 key라고 볼 수 있다.

그러나 학생의 이름은 중복값이 있을 수 있기 때문에 key라고 볼 수 없다.

그럴때 (학번, 학생의 이름) 이렇게 두개를 함께 key로 사용한다면 중복값이 있을 수 없으니까 key라고 볼 수 있다. 

키 중에는 superkey, candidate key, primary key, foreign key가 있으며 하나씩 살펴보도록 하겠다.

 

 super key란 relaion 안에 고유한 값을 가진 유니크한 속성의 집합이다.

위에서 말했던 {ID}, {SSN}, {ID, name}, {ID, name, dept_name} 같은 것들이라고 볼 수 있다.

{dept_name} 하나만 있을 시 superkey가 아니지만 ID와 함께 쓰였기 때문에 superkey이다.

{name}과 {name, dept_name}은 super key가 아니다. 앞에서 말했듯 name은 중복 될 수 있기 때문이다.

 

 candidate key란 super key중 원소가 하나인 것을 뜻한다.

{ID} 는 superkey이면서 candidate key 이고,

{SSN} 또한 superkey이면서 candidate key이다.

{ID,name}은 superkey이긴 하지만 원소가 두개이기 때문에 candidate key는 아니다.

 

primary key란 DB디자이너에 의해 선택된 candidate key이다.

instructor{ID, name, dept_name, salary, SSN

pk에는 이렇게 밑줄을 그어준다.

 

foreign key란 다른 relation의 primary key인 속성이다.

foreign key를 지정해주면 fk가 다른 relation의 primary key 안의 값으로만 지정될 수 있다.

 

2. primary key와 foreign key를 수정하고 삭제하기. 

 

table을 구성할 때 적어줘도 되지만 이미 테이블을 구성한 후라면 alter를 사용해 추가및 삭제한다.

 

<primary key 추가>

alter table book add primary key(custid);

:이렇게 해주면 custid가 book의 pk가 된다.

 

<primary key 삭제>

alter table book drop primary key;

:pk가 여러개 일 경우 추가처럼 뒤에 이름 적어서 구분 해주면 될듯. 전체 pk가 삭제되지는 않을 듯 하다. (나중에 해봐야지..)

 

<foreign key 추가 및 cascade 추가>

alter table orders add foreign key(bookid) references orders(custid) 
on update cascade
on delete cascade;

: foreign key(여기에는 fk 지정 해 줄 attribute를 적어주면 됨) references orders(pk인 attribute를 적으면 됨)

fk 설정 전 pk를 먼저 설정 해주어야한다. pk가 있어야 fk가 있을 수 있으니까 당연한거겠지.

on update cascade와 on delete cascade의 뜻은 pk에서 해당 tuple이 삭제 되었을 경우 fk에 있는 tuple에도 적용을 시켜준다는 뜻이다. cascade뜻을 검색해보니까 폭포수 라는 뜻이었다. 이 뜻 처럼 pk에서 삭제되어야 fk에 적용되는거지 fk에서 삭제한다고 pk가 삭제 되지는 않는다. (영어권 애들이 이럴때 부럽다 이런 뉘앙스를 검색 안해도 알 수 있으니까..)

 

<foreign key 삭제>

alter table orders drop constraint orders_ibfk_1;

: 여기서 애를 좀 먹었는데 foreign key 삭제를 검색하면 constraint 뒤에 있는 것을 제약 조건 명이라고 부르는 것이다!

그래서 이게 뭔데..; 그러고 검색을 해보니까 

select* from information_schema.table_constraints;

를 하면 db의 모든 제약 조건을 확인 할 수 있는 것 같다. 저걸 해 보면 

이렇게 뜨는데 (최신순으로 정렬 되는 듯 하다.) 내가 지정한 pk와 fk를 볼 수 있다. 

constraint 뒤에는 위 사진에 보이는 삭제하고싶은 fk의 CONSTRAINT_NAME을 적어주면 된다.

 

내가 alter 로 fk를 추가해 줄 때 on delete cascade를 빼먹어서 이렇게 쳐줬었는데  

 alter table orders add foreign key(bookid) references book(bookid) on update cascade on delete cascade;

이렇게 치면 수정이 되지 않는듯 위 코드를 두번 반복해도 delete가 적용 되지 않았고 (fk가 있어서 pk를 삭제할 수 없다 이런 오류가 떴었음. 여기서 알 수 있듯이 만약 fk와 pk를 없앨거라면 fk를 삭제 한 뒤에 pk를 없애야 할 것 같아(아직 확인을 안해봐서 정확히는 모르겠음)) 위 사진처럼 orders에 적용해준 fk가 네개인 걸 볼 수 있다. 그래서 어떻게 수정해야하나 하나가 저 CONSTRAINT_NAME 네개를 다 삭제하고 다시 fk를 지정 해 줬다.

alter table orders drop constraint orders_ibfk_1;

아까처럼 CONSTRAINT_NAME을 찾아서 constraint 뒤에 붙여주면 됨. 

 

댓글