Database/MySQL

MySQL) 외래키를 걸었는데, 제약조건이 따라온 경우 문제해결.

luana_eun 2022. 3. 24. 11:22
728x90

User 테이블에 userid 컬럼이 있고, 이 컬럼에는 not null과 unique 제약조건을 걸었다. 

Notice 테이블에 userid컬럼이 있고, User테이블의 userid와 외래키를 걸었다.

그런데....

 

외래키를 걸었더니 User테이블의 userid제약조건인 nn과 unique를 그대로 들고와서 걸렸다. 

게시판에는 한 유저가 많은 글을 쓸 수 있어야 하는데

unique가 걸려서 한 유저당, 하나의 글밖에 못쓰는 상황이 된 것이다. 

따라서 위의 사진에서 unique에 체크 표시를 풀고 Apply버튼을 눌렀지만 승인되지 않았다..

구글링을 해도 Foreign key와 unique관계를 뚜렸하게 설명하는 글을 찾기 힘들었다.

MySQL을 배운지 얼마되지 않아서 봐도 이해를 못한것일 수도..ㅎㅎ

 

외래키를 걸면 부모의 제약조건을 그대로 가져오는건가...? 싶었지만 그건 아니다. 

외래키를 건다고 해서 부모의 제약조건을 그대로 따라야 하는게 아니라 따로 설정할 수 있다.

단지, 부모에게 없는 값을 넣을 수 없다는 것이다. 

예를들어, 부모 컬럼에 [사과, 배, 포도] 라는 값이 들어있으면 

외래키를 건 자식은 [사과, 배, 포도] 중에서만 값을 넣을 수 있고, 부모에 없는 '딸기'는 들어갈 수 없다. 

 

 

그럼 왜 unique를 해제하고 Apply를 눌렀는데 왜 해제가 안되는것인가..ㅠㅠㅠ

알고보니, MySQL 워크벤치에서 먼가 꼬인게 있었던 것같다. 나는 쿼리문이 아닌, GUI창으로 외래키를 걸었었다.

여기서 외래키를 다시 해제하고, 이번엔 쿼리문으로 작성을 해보았다. 

use 데이터베이스 이름(테이블명 아님!);
alter table 테이블명 add constraint 제약조건명 key (외래키를 걸 컬럼명) references 부모테이블명(참조할 테이블의 컬럼명);

 

쿼리문으로 작성하니 제약조건을 아무것도 가져오지 않고 잘 걸렸다!!

만약 GUI환경으로 작업을 했을때 문제가 생겼다면, 쿼리문으로 작성해보는것을 추천한다.

728x90