사전 준비
실습 환경
mysql 8.0.27
테이블 생성
create table users(
user_id int not null auto_increment,
name varchar(100),
primary key(user_id)
);
create table board(
board_id int not null auto_increment,
title varchar(100),
content varchar(100),
user_id int,
primary key(board_id)
);
데이터 삽입
insert into users(name) values('hajoo1');
insert into users(name) values('hajoo2');
insert into board(title, content, user_id) values('title1', 'content1', 1);
insert into board(title, content, user_id) values('title2', 'content2', 2);
non-relational
- 외래키 설정 X
- users 테이블 user_id를 2 -> 3으로 변경
- 기본키는 연관 관계가 없다면 변경이 가능하다.
update users set user_id = 3 where name = 'hajoo2';
non-cascade
- 외래키 설정 O, cascade X
외래키 설정
alter table board add constraint ex_fk foreign key(user_id) references users(user_id);
users 기본키 변경
- users 테이블 user_id를 2 -> 3으로 변경
- 연관 관계에 있는 부모 행은 변경이나 삭제가 불가능하다고 나온다.
update users set user_id = 3 where name = 'hajoo2';
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`board`, CONSTRAINT `ex_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`))
board 외래키 변경
- board 테이블 user_id를 2 -> 3으로 변경
- 연관 관계에 있는 부모 행은 변경이나 삭제가 불가능하다고 나온다.
update board set user_id = 3 where title = 'title2';
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`board`, CONSTRAINT `ex_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`))
- board 테이블 user_id를 2 -> 1로 변경
- board 테이블 user_id만 1로 변경됨
update board set user_id = 1 where title = 'title2';
- 외래키의 경우에 부모 테이블에 존재하는 키일 경우에는 변경이 가능하다.
update-cascade
- 외래키 설정 O, cascade O
외래키 설정
alter table board add constraint ex_fk foreign key(user_id) references users(user_id) on update cascade;
users 기본키 변경
- users 테이블 user_id를 2 -> 3으로 변경
- users, board 테이블 user_id가 함께 변경됨
update users set user_id = 3 where name = 'hajoo2';
board 외래키 변경
- board 테이블 user_id를 3 -> 4로 변경
- 연관 관계에 있는 부모 행은 변경이나 삭제가 불가능하다고 나온다.
update board set user_id = 4 where title = 'title2';
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`board`, CONSTRAINT `ex_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON UPDATE CASCADE)
- board 테이블 user_id를 3 -> 1로 변경
- board 테이블 user_id만 1로 변경이 됨
update board set user_id = 1 where title = 'title2';
- 외래키의 경우에 부모 테이블에 존재하는 키일 경우에는 변경이 가능하다.