테이블 생성하기
-- member1 table
create table member1 (
name_id int not null auto_increment,
name char(6),
primary key(name_id)
);
-- buy1 table
create table buy1 (
buy_id int not null auto_increment,
product char(10),
name_id int,
primary key(buy_id)
);
데이터 넣기
-- member table
insert into member1 values (null,'CHOI'), (null,'KIM');
-- buy table
insert into buy1 values (null,'노트북', 1), (null,'폰',2);
테이블 상태
관계 설정하기
alter table buy1 foreign key (name_id) references member1(name_id);
기본키 변경 (member1 기본키 name_id 1을 3으로 변경하기)
-- 기본키 변경하기 (name_id 1을 3으로 변경)
update member1
set name_id = 3
where name = 'CHOI';
위와 같이 관계가 설정되어 있을 때 기본키를 변경하려고 하면 에러가 뜨게 됩니다.
외래키 변경도 한 번 볼까요?
외래키 변경 (buy1 외래키 name_id 2를 3으로 변경하기)
-- 외래키 변경하기 (name_id 2를 3으로 변경)
update buy1
set name_id = 3
where product = '폰';
위와 같이 관계가 설정되어 있을 때 외래키를 변경하려고 하면 에러가 뜨게 됩니다.
단, 기본키에 있는 값을 바탕으로 외래키를 수정하면 변경이 됩니다.
예를 들어) buy1 외래키 name_id = 2를 1로 변경할 때는 수정이 돼요. 왜냐하면 member1 기본키에 name_id = 1이 있기 때문
기본키를 변경하고 싶을 때는 on update cascade 사용하기
기본키 변경하면 외래키도 함께 변경하기
-- on update cascade 사용하는 법
alter table buy1 foreign key(name_id) references member1(name_id) on update cascade;
기본키 변경 (member1 기본키 name_id 1을 3으로 변경하기)
-- 기본키 변경하기 (name_id 1을 3으로 변경)
update member1
set name_id = 3
where name = 'CHOI';
아래와 같이 on update cascade를 설정해준 상태에서 기본키를 변경하게 되면, 기본키 + 외래키 함께 변경되는 것을 확인 할 수 있어요.
주의해야 할 것은 외래키만 변경하는 것은 불가능해요. (단, 기본키 값으로 존재한다면 가능)
예를 들어, buy1 외래키 name_id = 2를 4로 변경한다면 에러가 발생해요.
변경하고 싶다면? 기본키를 4로 바꿔주면, 외래키도 4로 함께 바뀌게 됩니다.
즉, 기본키가 중심이 되어야 한다는 겁니다.