dbeaver에서 foreign key를 생성하는 방법을 알아보겠습니다. postgresql에 접속한 것이니 참고 부탁드립니다.

 


 테이블 2개가 있습니다. user하고 reply입니다. user는 id와 username을 가지고 있어요.

 

 다음에, reply는 id와 content를 가지고 있어요. 그런데 뭔가 빠진 듯한 느낌이 납니다. 댓글을 작성한 주체가 없단 말입니다. 댓글을 작성하는 주체는 user가 될 텐데요. 이 유저를 참조하는 foreign key를 만들어 보겠습니다.

 

 

 먼저, 새로운 column을 추가해야 됩니다.

 

 

 user에서 id를 참조하기 위해, user_id라는 것을 새로 만들었습니다. Data type은 int4로 두었습니다. 여기서 중요한 정보 하나는, 유저의 id 값을 serial4로 설정하였는데요. user의 Columns에서 Data type을 확인해 보면, int4로 되어 있어서, 똑같이 int4로 선언해 주었습니다.

 

 

 이제 Foreign keys 탭으로 들어가서 외래키를 추가해 보겠습니다. Create New Foreign Key를 눌러보겠습니다.

 

 그러면 이런 이상한 창이 하나 뜨게 됩니다. Reference table은 참조할 테이블을 지정합니다. user_id는 User를 참조해야 하니, user를 선택합니다. 다음에, Columns 탭을 보시면, Column이 있는데요. 어떤 컬럼이 어떤 것을 참조할 것인지를 선택합니다. reply의 user_id가 유저의 pk를 참조해야 하므로, Column을 user_id로 선택합니다.

 

 다음에 On Delete와 On Update는 parent가 삭제되었을 때, 혹은 업데이트 되었을 때 어떻게 할 것인지를 나타내는데요. Cascade는 부모가 삭제되면 삭제되게 됩니다. 예를 들자면, 유저가 1번이였고, 1번이 작성한 댓글이 2, 3이였다고 해 보겠습니다. 1번 유저가 삭제된다면 댓글 2, 3이 모두 지워집니다.

 

 

 이제, fk에 대한 정보를 보면, Delete Rule이 Cascade로 설정된 것을 볼 수 있어요. 정리하면, 필드를 하나 추가하고, foreign key 탭을 눌러서 외래키를 추가하면 된다는 것입니다. 생각보다 직관적으로 되어 있으므로 그리 어렵진 않을 겁니다.

 


 이제 테스트를 하나 해 봅시다. 댓글을 2개 생성했어요. 1번 유저와 2번 유저가 하나씩 댓글을 썼습니다.

 

 id가 1인 유저를 지우면 어떻게 될까요?

 

 

 1개의 댓글만 남게 됩니다. 이는, id가 1인 유저가 삭제되었기 때문에, 이를 물고 있는 content가 "haha"인 댓글까지 같이 삭제된 것입니다.

 

 

 이제 Delete Rule을 Set NULL로 바꿔봅시다.

 

 

 유저 2번을 삭제했을 때 어떻게 변할까요? 댓글 정보가 사라질까요?

 

 

 아닙니다. 삭제된 유저가 댓글을 남겼다는 정보만 남아 있습니다. 혹은 특정한 유저가 댓글을 하나라도 쓴 경우 삭제를 거부하게 할 수도 있어요. 예를 들자면, 도서를 대출한 경우에 회원 탈퇴를 거부한다던지 등이 있을 겁니다. 이 경우, fk에 on delete restrict를 걸면 됩니다.