데이터베이스

[MySQL] ALTER 를 통하여 PRIMARY KEY 와 FOREIGN KEY의 추가와 삭제 조건

joheamin 2025. 2. 27. 13:47

SQL에선 ALTER 라는 DDL문을 통해 제약조건들을 추가, 삭제를 할 수 있다.

 

이때 특히 서로 다른 테이블의 관계를 지어주는 역할인 FOREIGN KEY 와 PRIMARY KEY의 변경은

ALTER에 대한 조건이 있다.

 

어느 경우에 FOREIGN KEY 와 PRIMARY KEY의 ALTER 가 실행이 되고 안되는지를 살펴보겠다.

 

 

🔷 참조 관계를 형성할 테이블 생성

◾ 부모 테이블 생성과 데이터 삽입
CREATE TABLE parent(
	parent_id	int,
    name	varchar(10)
);

insert into parent values(1,'AA');
insert into parent values(2,'BB');
insert into parent values(3,'CC');
insert into parent values(4,'DD');
insert into parent values(5,'EE');

◾ 자식 테이블 생성

CREATE TABLE child(
	child_id 	 INT,
    name	 	VARCHAR(10),
    parent_id_fk	  INT
);

insert into child values(1,'aa',1);
insert into child values(2,'bb',2);
insert into child values(3,'cc',3);
insert into child values(4,'dd',4);
insert into child values(5,'ee',5);

 

 

 

🔷 PRIMARY KEY 생성 

◾ parent 테이블과 child 테이블 각각에 생성
ALTER TABLE parent ADD PRIMARY KEY(parent_id);
ALTER TABLE child ADD PRIMARY KEY(child_id);

 

❓ PRIMARY KEY 가 생성이 안되는 경우

  • PRIMARY KEY가 되는 컬럼의 값 중 중복되는 값이 있는 경우 => PRIMARY KEY 는 중복 허용 ❌

 


🔷  FOREIGN KEY 생성

◾child에 parent 의 PRIMARY KEY를 참조하는 FOREIGN KEY 생성
ALTER TABLE child ADD CONSTRAINT FOREIGN KEY(parent_id_fk)
				REFERENCES parent (parent_id);


👉 child에 parent_id_fk 칼럼 외래키
      parent에 parent_id 칼럼 참조키 

 

❓ FOREIGN KEY 가 생성이 안되는 경우

FOREIGN KEY를 부여하려는 칼럼의 값 중 PRIMARY KEY 에 존재하지 않는 값이 있는 경우 

예를 들어
게시물은 반드시 존재하는 회원의 식별자를 가지고 있어야하는데
존재하지 않는 회원의 식별자를 가지고 있는것은 있을 수 없다.

 

 


 

🔷 PRIMARY KEY 삭제

 ◾ PRIMARY KEY 삭제
ALTER TABLE parent DROP PRIMARY KEY;  -- 부모
ALTER TABLE child DROP PRIMARY KEY;  -- 자식

 

❓ PRIMARY KEY 가 삭제가 안되는 경우

자식테이블이 부모테이블의 PRIMARY KEY를 참조하고 있는 경우

 


 

☑️ 결론

 

 

⚫ PRIMARY KEY

👉 생성 : 칼럼 값 중 중복되는 값이 없다면 생성 가능

👉 제거 : 현재 자신의 PRIMARY KEY를 참조하고 있는 자식 테이블이 없다면 삭제 가능

 

⚫ FOREIGN KEY

👉 생성 : FOREIGN KEY의 값 중 참조하려는 칼럼 값 안에 존재 하지 않는 값이 있는 경우 생성 불가 

👉 제거 : 언제든 제거 가능 

 


🤔 PRIMARY KEY 를 삭제나 변경하면 참조하고 있는 FOREIGN KEY 도 삭제 하면 안되나?

가능하다.

 

❓ CASCADE란

참조키를 삭제나 변경을 하게 될 경우 참조하고 있는 자식 테이블의 외래키 값 까지 함께 변동된다.

 

CASCADE 추가
ALTER TABLE [테이블명] 
ADD CONSTRAINT FOREIGN KEY (칼럼명) 
REFERENCES [참조할 테이블명](칼럼명) 
ON DELETE CASCADE ON UPDATE CASCADE;