본문 바로가기

프로그래밍/DataBase

MySQL에서 Foreign Key 만들기

MySQL에서는 그냥 아무 생각없이 스키마를 만들게 되면 Foreign Key를 만들 수가 없다.
그래서 오늘은 MySQL에서 Foreign Key를 만드는 방법을 알아보자.

  1. 먼저 foreign key의 reference가 될 스키마를 만든다.
    여기에서는 테이블 이름은 test_student로 했고, 학번이 PK이다. 스키마를 생성할 때에 Storage Engine을 MyISAM이 아닌 InnoDB로 해줘야 한다.
    만약 MyISAM으로 스키마를 만들 경우에는 FK가 지원되지 않는다고 한다.


  2. 다음으로 foreign key가 존재할 스키마를 만든다.
    이 때에도 Storage Engine을 InnoDB로 하고, 스키마의 이름은 test_foreign으로 해주었다.
    그리고 중요한 것이 FK로 할 속성의 경우, FK속성이 다른 속성과 함께 PK이거나 Index항목을 체크해주어야 한다.
    PK가 되면 자동으로 Index가 등록되는데, 이런 내용으로 보아서는 FK가 될 속성은 반드시 Index가 등록되어야 하는 것으로 보인다.



  3. test_foreign 스키마를 생성한 후에 탭을 누르면 아래와 같은 화면을 확인할 수 있을 것이다.



    여기에서 를 누르면 아래 그림과 같은 화면이 나타난다.

    위의 화면에서 학번을 FK로 하고 싶으면 "학번" 옆에 있는 드랍박스에서 test_student->학번을 선택하면 현재 테이블의 학번 속성을 FK로 하는데 참조를 test_student의 학번 속성으로 하겠다는 의미이다.



    또 여기에서 ON DELETE부분과 ON UPDATE부분이 있는데 이 부분의 값을 어떻게 주냐에 따라서 동작 방식이 달라진다.
    ON DELETE는 참조하는 테이블의 투플이 삭제됐을 때 어떻게 할 것인지를 결정하는 부분이고, ON UPDATE는 참조하는 테이블의 투플이 update되었을 때 어떻게 할 것인지 동작 방식을 결정하는 부분이다.

    아직 이 부분의 값을 변경해가며 써보지 않아서 정확히는 알 수 없지만, 대충 짐작해 보면 ON DELETE에 CASCADE로 되어 있으면 참조의 대상이 되는 테이블의 투플을 delete하는 경우가 발생했을 때에 그를 참조하는 투플을 같이 지우고, ON UPDATE가 CASCADE이면 참조의 대상이 되는 테이블의 투플을 update하는 경우에 그를 참조하는 투플을 같이 지우는 것 같다.
    SET NULL의 경우에는 참조의 대상이 되는 테이블에서 해당 쿼리를 수행하면 그를 참조하는 테이블의 투플의 속성 부분이 NULL 값으로 셋팅되는 것으로 예상된다.
    NO ACTION의 경우에는 참조의 대상이 되는 테이블에서 해당 쿼리를 수행하더라도 그를 참조하는 테이블에서 아무 일도 하지 않을 것으로 예상된다.
    RESTRICT는 잘 모르겠다.;;