Cute Blinking Unicorn

서버/DB

10/13 DB SQL 총정리 (외래키 추가 primary key())

민밥통 2023. 10. 13. 17:16

테이블: 학생

컬럼: 아이디, 이름, 학년, 나이

 

테이블: 교수님

컬럼: 아이디, 이름, 수업담당 

 

테이블: 과목

컬럼: 아이디, 과목명

 

 

( 1인 경우 색칠 안함)

학생 : 교수님 ( N : 1 )

학생 : 과목 ( M : N )

과목 : 교수님 ( N : 1 )

 

1 : 1 일 땐 프리마키를 어디다 둬도 상관 없으니 

테이블을 최상단에 올려도 문제 없다.

 

BUT,

 

1 : N 일 땐 프리마키를 N쪽에 둬야한다. WHY?

1의 정보를 N에서 참조해야 중복된 값이 없다.

N의 정보를 1에서 참조한다면 하나씩 찾아야 하기 때문에 어렵다.

 

그리고 프리마키는 그 사람의 열쇠이기 때문에 그 열쇠를 갖고와서 정보를 연다면 그 사람의 모든 정보를 알 수 있다.

이해하기 어려우니   학생 : 교수님 ( N : 1 ) 으로 예시를 들어보자.

 

교수님이 학생의 정보를 궁금해하니 id(열쇠)를 눌러서 열어보자. 그러면 학생의 모든 정보를 알 수 있기 때문에

테이블 당 하나의 컬럼을 하나씩 프리마키를 만들지 않아도 된다.

 

따라서 프리마키 하나를 고유의 값 id int auto_incrment 으로 치면 아이디가 자동으로 생성되기때문에

이렇게 잡고 아이디를 가져와서 데이터를 입력하면 된다.

 

N : M 일 땐 새로운 테이블을 만들어야 한다

새로운 테이블을 만들어 온다(create table teach)

아, 참고로 이건 교수와 학생의 N:M이다.

 

create table teach (
s_id int,     
p_id int,     
day date,     
primary key(`s_id`, `p_id`),     
foreign key(`s_id`) references `student`(`id`),    
foreign key(`p_id`) references `professor`(`id`) 
);

참고해야할 점은

프리마키를 primary key(`s_id`, `p_id`) 두 개의 관계를 만들어야하고 ( 지정한 테이블의 아이디를 좀 다르게 해야 구분이 가능)

foreign key(`s_id`) references `student`(`id`), 

 

이 프리마키에서 참고자료를 (references)  학생( student)의 id 프리마키를 참고한다는 것이다.

 

insert into teach(s_id, p_id, day) values(1, 1, '2023-10-13');

 

이런식으로 추가를 한다면,

따라서 테이블은 아마

s_id p_id day
1 1 '2023-10-13'

이렇게 나올 것이다. 

 

한번 도전해보는 것이 나쁘지 않을 것이다.