Foreign Key 제대로 사용하기 1

순동·2022년 4월 14일
0

📌 course 테이블과 review 테이블 만들기

  • course : 각 수업들의 정보가 담긴 테이블
  • review : 학생들이 남긴 강의 평가가 담긴 테이블

✅ course 테이블 생성

CREATE TABLE course_rating.course (
	id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR(30) NULL,
    semester VARCHAR(6) NULL,
    maximum INT NULL,
    professor VARCHAR(10) NULL,
    PRIMARY KEY(id)
);

실행 후 새로고침을 하면 course 테이블이 생성되어 있다.

✅ review 테이블 생성

CREATE TABLE course_rating.review (
	id INT NOT NULL AUTO_INCREMENT,
    course_id INT NULL,
    star INT NULL,
    comment VARCHAR(500) NULL,
    PRIMARY KEY(id)
);

실행 후 새로고침을 하면 review 테이블이 생성되어 있다.


📌 course 테이블과 review 테이블 채워넣기

INSERT INTO를 이용해 row를 추가한다.

✅ course 테이블에 row 추가

INSERT INTO course (title, semester, maximum, professor) VALUES ('프로그래밍 기초:파이썬', '1-1', 70, '강명훈');
INSERT INTO course (title, semester, maximum, professor) VALUES ('자료구조와 알고리즘', '2-1', 60, '성태희');
INSERT INTO course (title, semester, maximum, professor) VALUES ('컴퓨터 개론', '1-1', 100, '손동민');
INSERT INTO course (title, semester, maximum, professor) VALUES ('데이터 사이언스 입문', '3-1', 60, '최지욱');
INSERT INTO course (title, semester, maximum, professor) VALUES ('객체 지향 프로그래밍', '3-2', 50, '김현수');
INSERT INTO course (title, semester, maximum, professor) VALUES ('머신러닝', '3-2', 40, '하우재');
INSERT INTO course (title, semester, maximum, professor) VALUES ('웹의 기본', '2-2', 50, '강소원');
INSERT INTO course (title, semester, maximum, professor) VALUES ('유닉스 시스템', '3-1', 40, '이규리');
INSERT INTO course (title, semester, maximum, professor) VALUES ('SQL 기초와 활용', '4-1', 40, '민종훈');

✅ review 테이블에 row 추가

INSERT INTO review (course_id, star, comment) VALUES (1, 5, '이렇게 파이썬을 쉽게 배울 수 있다니 교수님 감사합니다!');
INSERT INTO review (course_id, star, comment) VALUES (1, 5, '요새 대세는 파이썬 것 같아요, 이번 수업으로 확실하게 마스터했습니다~');
INSERT INTO review (course_id, star, comment) VALUES (1, 4, '과제가 너무 많아서 힘들었지만 그만큼 많은 것들을 배웠습니다');
INSERT INTO review (course_id, star, comment) VALUES (1, 5, '이 수업 듣고 이제 저는 개발자가 되기로 결심했습니다.');
INSERT INTO review (course_id, star, comment) VALUES (2, 5, '어려운 내용을 쉽게 가르쳐주셔서 감사합니다');
INSERT INTO review (course_id, star, comment) VALUES (2, 3, '음, 뭔가 어려운 부분들이 아직 이해되지 않았어요');
INSERT INTO review (course_id, star, comment) VALUES (2, 4, '배운 내용을 계속 반복하면 원하는 자료구조를 코드로 스스로 짤 수 있을 것 같아요');
INSERT INTO review (course_id, star, comment) VALUES (3, 5, '와, 컴퓨터 공학과 오길 잘했다는 느낌이 들어요~');
INSERT INTO review (course_id, star, comment) VALUES (3, 5, '정말 초보자를 위한 최고의 수업인 것 같아요, 후배들한테도 강추하려고 합니다');
INSERT INTO review (course_id, star, comment) VALUES (3, 3, '재밌긴 한데 저는 원래 어느 정도 알고 있던 내용들이라 ㅎㅎ');
INSERT INTO review (course_id, star, comment) VALUES (3, 5, '교수님의 재미있는 입담에 시간가는 줄 모르고 들을 수 있습니다, 나중에 취업 방향 정할 때도 큰 도움이 될 것 같아요');
INSERT INTO review (course_id, star, comment) VALUES (3, 4, '처음에는 어쩔 수 없이 선택한 강의인데 듣고나니 너무 좋네요');
INSERT INTO review (course_id, star, comment) VALUES (3, 5, '이제 제가 뭘 공부해야할지 감이 확 오네요~');
INSERT INTO review (course_id, star, comment) VALUES (4, 5, '데이터 사이언스 너무 재미있어요! 이 수업에서 교수님이 추천해주신 책으로 열심히 독학 중입니다');
INSERT INTO review (course_id, star, comment) VALUES (4, 3, '수식에 대한 설명이 좀 불친절한 거 빼곤 괜찮았어요, 제가 수학이 약해서 그런가봐요 흑');
INSERT INTO review (course_id, star, comment) VALUES (4, 5, '이 수업이 그렇게 좋다고 해서 들어봤는데 대만족입니다');
INSERT INTO review (course_id, star, comment) VALUES (5, 4, '나쁘지 않네요, 그런데 실습이 좀 부족해서 아직 확실히 감은 안 온 것 같아요');
INSERT INTO review (course_id, star, comment) VALUES (5, 3, '객체가 뭔지 알게된 것이 참 좋은 것 같아요, 그런데 수업 자료가 조금 부실한 느낌은 있었네요');
INSERT INTO review (course_id, star, comment) VALUES (5, 5, '객체 지향 프로그래밍의 의미를 확실하게 이해했어요, 좋은 수업 감사합니다 교수님');
INSERT INTO review (course_id, star, comment) VALUES (5, 5, '교수님이 내주신 과제랑 비슷한 문제가 인턴 면접 문제로 나왔어요, 바로 손쉽게 풀 수 있었습니다. 강추합니다~');
INSERT INTO review (course_id, star, comment) VALUES (6, 5, '머신러닝 정말 제대로 배워보고 싶었는데 이 수업을 통해 제대로 기반을 다졌습니다.');
INSERT INTO review (course_id, star, comment) VALUES (6, 5, '선배들이 다 이 수업 들으라고 했는데 이유를 알겠네요, 학비가 전혀 아깝지 않은 수업이었어요');
INSERT INTO review (course_id, star, comment) VALUES (6, 3, '내용은 좋은데 시간에 비해 너무 많은 양을 다루시려고 한 것 같아요, 뒷 부분이 너무 술술 넘어간 느낌이었어요');
INSERT INTO review (course_id, star, comment) VALUES (6, 4, '머신러닝 너무 재밌네요, 이 교수님 딥러닝 수업도 곧 개설된다고 하는데 4학년 때 바로 들을 겁니다');
INSERT INTO review (course_id, star, comment) VALUES (6, 5, '이 수업 이후로 저는 이제 데이터 사이언티스트로 진로를 정했습니다!');
INSERT INTO review (course_id, star, comment) VALUES (7, 5, '웹 프로그래밍을 앞으로 하고 싶은 분은 꼭 들으세요, 웹이 생각보다 기초잡기가 어려운데 이만한 수업이 없습니다~');
INSERT INTO review (course_id, star, comment) VALUES (7, 3, '교수님 너무 과제가 많아요ㅜ 스스로 공부도 좋지만 바로 알려주시면 안 될까요? 수업은 참 좋았어요');
INSERT INTO review (course_id, star, comment) VALUES (7, 4, '웹의 기본을 충실히 다뤄주는 수업입니다. 그런데 웹에서 보안 관련된 부분도 배우고 싶은데 아쉽네요.');
INSERT INTO review (course_id, star, comment) VALUES (8, 5, '유닉스라는 게 굉장히 중요한 운영체제라는 걸 알게 됐습니다.');
INSERT INTO review (course_id, star, comment) VALUES (8, 3, '컴퓨터의 역사에 대해서 쭉 훑을 수 있어서 좋았습니다!, 그런데 당장 취업에 도움이 될지는 모르겠어요');
INSERT INTO review (course_id, star, comment) VALUES (8, 5, '우리가 배우는 컴퓨터에 대해서 그 역사를 유명인들과 함께 스토리텔링 식으로 듣다보니 정말 재밌습니다~');
INSERT INTO review (course_id, star, comment) VALUES (8, 4, '뭔가 기초적인 커맨드만 배워서 살짝 아쉬운 감은 있지만 그래도 꽤 유용한 수업입니다');
INSERT INTO review (course_id, star, comment) VALUES (9, 5, '정말 깔끔하고 충실한 강좌입니다, 이 수업 듣고 책 한권 본 후에 관련 자격증 시험 봤는데 한 번에 붙었습니다!');
INSERT INTO review (course_id, star, comment) VALUES (9, 5, '교수님이 저희를 위해 정말 심혈을 기울이신 게 느껴져요, 좋은 강의였습니다');
INSERT INTO review (course_id, star, comment) VALUES (9, 5, 'SQL 뭔가 쉬운 듯 어려운 듯 그랬었는데 이 수업으로 한방에 정리했어요~');
INSERT INTO review (course_id, star, comment) VALUES (9, 5, '강추! 강추! 강추!입니다 꼭 들으세요, 어차피 SQL 무조건 한번은 배워야하는데 이 강의 하나로 충분합니다~');

review 테이블의 course_id 컬럼은 course 테이블의 id 컬럼을 참조한다.


📝 Foreign Key가 필요한 이유

Foreign Key란 한 테이블의 컬럼 중에서 다른 테이블의 특정 컬럼을 식별할 수 있는 컬럼이다. 우리말로 외래키라고 한다.

  • 왼쪽이 강의평가들이 저장돼있는 review 테이블
  • 오른쪽이 수업(강의) 정보들이 저장돼있는 course 테이블

이런 경우를 두고 Foreign Key로 다른 테이블의 Primary Key참조(reference)한다라고 표현한다.

  • Foreign Key가 존재할 때 Foreign Key가 있는 테이블을 자식 테이블(child table)이나 참조하는 테이블(referencing table)
  • Foreign Key에 의해 참조당하는 테이블을 부모 테이블(parent table), 참조당하는 테이블(referenced table)

DBMS 상에서 한 테이블의 컬럼을, 이것이 다른 테이블의 컬럼을 참조하는 Foreign Key다라고 설정해놓으면 참조 무결성(Referential Integrity)을 지킬 수 있다.

참조 무결성이란 두 테이블 간에 위와 같은 참조 관계가 있을 때 각 데이터 간에 유지되어야 하는 정확성과 일관성을 의미한다.

참조 무결성을 지키기 위해 특정 컬럼을 Foreign Key로 설정한다.


📌 Foreign Key 설정하기

Foreign Key참조 무결성을 지키기 위해 필요하다.
review 테이블의 course_id 컬럼을 Foreign Key로 설정하자.

review 테이블 속성 보기를 누른 후 화면 하단에 Foreign Keys 탭을 누른 후 아래와 같이 설정한다.

위처럼 설정하는 게 아닌 SQL문으로도 Foreign Key 설정이 가능하다.

ALTER TABLE `course_rating`.`review` 
ADD CONSTRAINT `fk_review_table`
  FOREIGN KEY (`course_id`)
  REFERENCES `course_rating`.`course` (`id`)
  ON DELETE RESTRICT
  ON UPDATE RESTRICT;
  • Foreign Key제약사항 중의 하나이다.
  • CONSTRAINT를 작성하지 않으면 자동으로 임의의 이름이 설정된다.

📝 SHOW CREATE TABLE 문

SHOW CREATE TABLE 문은 특정 테이블을 지금 바로 생성한다고 할 때 작성해야할 CREATE TABLE 문이 뭔지를 보여준다.

Foreign Key를 설정한 직후의 review 테이블을 CREATE TABLE 문으로 바로 생성하려면 어떻게 할 수 있는지 살펴보자.

SHOW CREATE TABLE review;

이 결과에서 Create Table 쪽의 칸을 클릭하고, 마우스 오른쪽 버튼을 누른다.

Copy Field(unquoted)를 클릭한 후 붙여넣기를 한다.

현재 상태의 review 테이블을 만들려면 CREATE TABLE 문을 어떻게 써야하는지 바로 알 수 있다.


0개의 댓글

관련 채용 정보