나의 수업일지

인천 일보 아카데미 27일차-1- 참조관계 / 참조관계-특징 / 참조관계 - 제약조건 / pk-fk

GUPING 2023. 3. 31. 16:59
  • 참조관계 알아보기

1:1관계
블로그를 비유로
1명의 회원은 하나의 블로그만 소유할 수 있다

1:N관계
게시판을 비유로
1명의 회원은 여러개의 글을 쓸 수 있다 , 1명의 회원은 여러개의 댓글을 쓸 수 있다

N:1 관계
비유가 없다
정말 잘 쓰지 않는다

N:M관계
매우 복잡하기 때문에 잘쓰지 않는다
대부분 N:1 , 1:M 관계로 분리하고 분리하

 

  • 참조관계 알아보기 - 특징

참조관계가 맺어진 후에 부모테이블 삭제하는 경우 삭제 불가능하다

그렇기 때문에 자식 테이블도 삭제해야 삭제가 가능하다

 

  • 참조관계 실습

constraint fk_comment1 foreign key(board1_id) references board1(id)

-- constrint fk_commnet1 foreign key(board1_id) 
-- comment 테이블안에 컬럼 board1_id을

-- references board1(id)
-- board1 테이블 안에 컬럼 id를 참조하게한다

-- 부모 데이터 삭제
-- 1,2번게시글에는 댓글이 있고 , 3,4번 게시글에는 댓글이 없음
-- 3번 게시글 삭제
delete from board1 where id =3;
-- 삭제를 할때는 꼭 해당 테이블의 고유한 pk를 가지고 삭제를 한다
-- 2번 게시글 삭제
delete from board1 where id =2; 
-- comment board1_id가 board1에 있는 id컬럼을 참조하고 있기 때문에 삭제 불가
-- 2번 게시글에 작성된 댓글 삭제 (댓글번호 3) 후 2번 게시글 삭제
delete from comment1 where id =3;
delete from board1 where id =2;

부모테이블을 자식테이블이 참조하면

컬럼끼리도 부모 자식으로 참조가 된다는 걸 알 수 있다

 

  • 참조관계 - on delete cascade

constraint fk_comment2 foreign key(board2_id) references board2(id) on delete cascade
-- on delete cascade : 부모데이터 삭제시 자식 데이터도 함께 삭제
-- 단 , 테이블은 전과 마찬가지로 참조하는 테이블이 없어야 삭제 가능하다

 

 

  • 참조관계 - on delete set null

constraint fk_comment3 foreign key(board3_id) 
	references board3(id) on delete set null
-- on delete set null : 자식 데이터는 유지되지만 참조 컬럼은 null로 바뀜

게시글 컬럼의 정보를 삭제했기에 댓글 컬럼의 정보가 null로 바뀐모습

 

  • 참조관계 - 수정 쿼리

update board3 set board_contents = '안녕하세요' where id = 1;

컬럼에 데이터를 수정하기 위해서 pk로 지정된 컬럼이 필요하다

없다면 모든 정보가 수정되기 때문에 꼭 컬럼의 고유한 pk데이터가 필요하다

 

 

  • 참조관계 - 자동번호 적용하기

id bigint auto_increment
auto_increment : 자동으로 값이 1씩 증가

id 에 auto_increment 를 적용하였기 때문에 insert 단계에서도 작성하지 않는다
auto_increment는 고유한 값에만 적용 가능하다 즉, pk를 적용하지 않으면 사용할 수 없다

 

  • 자투리 - 안전 삭제

-- 삭제 : 그냥 삭제
drop table board1; 
-- 안전 삭제 : 있으면 지우고 없으면 말고
drop table if exists board1;

테이블 이름이 겹치는 상황을 방지하기위해 대부분 테이블 위에 drop talbe을 작성해주는데
만약 긴 테이블 쿼리문을 한번에 실행하는경우
그냥 drop talbe을 사용하게되면 에러가 뜨며 그자리에서 멈추기 때문에 drop table if exists를 사용해준다
실제로 drop table보다 drop table if exists를주로 사용한다