[DataBase] MariaDB_MySQL에서 ALTER TABLE을 사용하여 FOREIGN KEY CONSTRAINT 추가하기(외래키 제약조건 설정)
이번 포스트에서는 ALTER TABLE 명령어로 키 제약조건(KEY CONSTRAINT)를 추가하는 방법을 포스팅 하겠습니다.
실습에 재료가 되는 테이블은 "여기" (이전 포스트) 에서 작성 하였습니다.
0. 현재의 reserves 테이블
현재 reserves 테이블은 위의 내용을 담고 있습니다.
sid와 bid는 각각 sailors 테이블의 sid, boats 테이블의 bid를 나타냅니다.
즉, primary key 입니다.
1. sailors 테이블의 한 튜플을 삭제해 보자.
delete from where 문법을 사용하여 sailors의 한 튜플을 삭제하려고 시도 해보았습니다.
하지만 예상과는 다르게 에러를 뿜습니다.
reserves테이블을 생성할때, primary key이외에 아무 조건을 주지 않았습니다. 이때 sql은 NO ACTION을 조건으로 생성하는데, 이는 참조되는 테이블에서 삭제가 이루어지지 못하게 합니다.
이 이미지에서, 형광펜 표시를 한 부분은 바로 CONSTRAINT 필드의 이름입니다.
reserves의 sid는 이 reserves_ibfk_1 이라는 CONSTRAINT에 의해 관리됩니다.
다음으로 이 제약조건을 수정하는 법을 알아보겠습니다.

예를 들기 위해, 기존의 reserves 테이블에 sid 22를 갖는 여러개의 튜플을 삽입 하였습니다.

우선, 하나의 CONSTRAINT를 없애는 명령어를 수행해야 합니다.
우리의 목적은, 외래키의 제약조건을 넣는 것인데, 수정하려면 기존의 FOREIGN KEY를 버려야 합니다.
ALTER TABLE (테이블 이름) DROP FOREIGN KEY (CONSTRAINT 이름);
2에서 기존의 CONSTRAINT를 없앴습니다.
이제 새로운 키 제약조건을 넣을 차례 입니다. 2에서 외래키 또한 삭제 되었으므로,
새롭게 외래키 설정하고 ON DELETE CASCADE 옵션을 넣었습니다.
이 옵션은, 참조되는 테이블의 참조되는 키가 삭제되면, 이 reserves 테이블에서도 삭제한다는 제약조건 입니다.


reserves의 bid 또한 2를 수행한 후 새롭게 추가 해주었습니다.
기존에는 삭제가 불가능했습니다.
하지만 지금 우리는 reserves의 외래키 제약조건에 ON DELETE CASCADE를 넣은 상태 입니다. 따라서 sailors의 튜플을 지우면 reserves의 튜플도 삭제되어야 합니다.
실행 결과, sailors의 sid = 22인 것을 지우면 reserves의 sid = 22도 삭제되는것을 알 수 있습니다.
형광펜 표시한 부분의 이름을 본인의 테이블 이름으로 바꾸게 되면 현재 그 테이블이 가지는 제약조건을 확인할 수 있습니다.
reserves 테이블의 제약조건을 확인한 결과 5개의 제약조건이 있습니다.

2. 외래키 해제하기.
예를 들기 위해, 기존의 reserves 테이블에 sid 22를 갖는 여러개의 튜플을 삽입 하였습니다.
우선, 하나의 CONSTRAINT를 없애는 명령어를 수행해야 합니다.
우리의 목적은, 외래키의 제약조건을 넣는 것인데, 수정하려면 기존의 FOREIGN KEY를 버려야 합니다.
ALTER TABLE (테이블 이름) DROP FOREIGN KEY (CONSTRAINT 이름);
3. 새로운 제약조건 설정하기.
2에서 기존의 CONSTRAINT를 없앴습니다.
이제 새로운 키 제약조건을 넣을 차례 입니다. 2에서 외래키 또한 삭제 되었으므로,
새롭게 외래키 설정하고 ON DELETE CASCADE 옵션을 넣었습니다.
이 옵션은, 참조되는 테이블의 참조되는 키가 삭제되면, 이 reserves 테이블에서도 삭제한다는 제약조건 입니다.
reserves의 bid 또한 2를 수행한 후 새롭게 추가 해주었습니다.
4. 제약조건 설정 후 삭제 수행해보기.
기존에는 삭제가 불가능했습니다.
하지만 지금 우리는 reserves의 외래키 제약조건에 ON DELETE CASCADE를 넣은 상태 입니다. 따라서 sailors의 튜플을 지우면 reserves의 튜플도 삭제되어야 합니다.
실행 결과, sailors의 sid = 22인 것을 지우면 reserves의 sid = 22도 삭제되는것을 알 수 있습니다.
5. 한 테이블의 제약조건 이름 확인하기(CONSTRAINT_NAME 확인하기)
형광펜 표시한 부분의 이름을 본인의 테이블 이름으로 바꾸게 되면 현재 그 테이블이 가지는 제약조건을 확인할 수 있습니다.
reserves 테이블의 제약조건을 확인한 결과 5개의 제약조건이 있습니다.
DROP 명령어를 수행한 경우 삭제되는것을 확인할 수 있습니다.
6. 하나의 CONSTRAINT에 여러 FOREIGN KEY를 넣는것은 안된다.
ADD CONSTRAINT를 사용하여 여러 외래키를 삽입하고자 하였으나 실패하였습니다.
이 부분이 된다면 지적해 주시면 감사하겠습니다.
지금까지 [DataBase] MariaDB_MySQL에서 ALTER TABLE을 사용하여 FOREIGN KEY CONSTRAINT 추가하기(외래키 제약조건 설정)을 알아보았습니다. 감사합니다.
댓글
댓글 쓰기