[SQL] 테이블 생성2 - 참조

[원본 링크]

데이터베이스를 구성하다보면 어떤 테이블에서 다른 테이블의 데이터를 참조할 경우가 있다. 꽤 잦다.

가령 학교의 모든 학생에 대한 정보를 나타내는 테이블, Student가 있고,
이에 더해 컴퓨터공학과의 인원을 나타내는 테이블 Comeng_Student를 만든다고 치자.

그럼 대략 개개인의 학생 정보를 죄다 때려넣기보단, Student에 대한 참조를 구성하는 것이 무결성이나 편의성, 성능이나 메모리 효율성 측면에서 전부 우월할 것이다.
만약 그대로 다 때려넣었는데, 한명이 자퇴를 한다면, Student와 Comeng_student에서 그 정보를 동시에 삭제해야 한다. 하지만 참조를 사용한다면 이러한 문제를 편리하게 처리할 수 있다.

먼저 Student 테이블을 구성해보자.
테스트 환경은 MySQL이다.

간단하게 이름만 넣어놨다.

데이터도 넣어주고

이제 저걸 참조하도록 해보자.
다른 테이블의 키를 참조하는 속성을 외래 키(Foreign Key)라고 한다.
그래서 사용 키워드도 foreign key다. 그리고 참조할 대상은 references로 지정한다.
foreign key(적용 속성) references 참조테이블명(참조속성)

이러면 된다.

이제 아까 있던 학생들을 참조해보도록 하자.
john과 rust만 추가해보도록 하겠다.

간단하다. 이제 이것들을 이용해서 간접적으로 Student에 접근하면 되는 것이다.

Comeng_Student에 속한 Student만 조회하고 싶다면, 이런식으로 중첩질의를 쓰면 된다.

그리고 이외에도 문제가 몇가지 있다.
만약 원본 데이터가 수정되거나 변경된다면, 그걸 참조하고 있는 외래키는 어떻게 반응하는가?

이에 대한 설정을 또 건드릴 수가 있다.
테이블 생성시 외래키를 설정할 때, 뒤에다가 on delete, on update와 함께 일련의 키워드들을 붙여주는 것이다.
on delete는 원본 데이터가 삭제될 경우, on update는 원본 데이터가 수정될 경우다.
1.no action: 바꿔도 그냥 냅둠
2.cascade: 원본이 삭제되면 참조도 삭제, 변경되면 똑같이 변경.
3.set null: 원본이 바뀌거나 삭제되면 참조를 null로 변경
4.set default: 원본이 바뀌거나 삭제되면 참조를 디폴트값으로 변경(대부분 null)

다른 DB는 어떨지 모르겠지만, 일단 MySQL에선 따로 설정을 하지 않는다면 참조되고 있는 원본을 삭제하거나 변경할 수가 없다.
따라서 Comeng_Student에서 참조하고 있는 Student의 원본 값 john을 지우려고 하면

이렇게 에러가 뜬다.

일단 저기서 제일 괜찮아보이는 cascade를 써서 다시 테이블을 생성해보겠다.

아까처럼 다시 데이터도 넣어줬다.

자 이제 다시 john을 지워보자.

잘 된다.

이제 다시 저기서 6이 가리키고 있는 원본 tom의 키를 건드려보자.

역시 잘 된다.
바뀌었다고 말해준다.


다시 보면 여기서도 바뀌어있다.

이런 식이다.