SQL

[🎉중급🎉] 외래키

Bordercolli 2023. 8. 28. 11:10
728x90

🐶 외래키

외래키는 일종의 제약사항이다.

외래키를 설정해두면 데이터를 넣거나 삭제할때 제약사항이 따르게 된다. 해당 제약에 맞춰서 넣고 삭제한다.

꼭 써야하지는 않지만, 외래키를 통해서 제약사항을 두면 데이터의 정확성, 신뢰성 이런 것들이 올라간다.

기본키와 함께 여러 테이블에 데이터를 넣을때 외래키를 통해서 연결하는 경우가 있어서 외래키를 기본적으로 알고 있어야 한다.

이해하기 위해서는 

이렇게 하면 SQLDB라는 데이터베이스가 만들어진다.

설명 : 이 쿼리를 보면 SQLDB가 이미 있다면 삭제하고 다시 만들어달라.

그리고 userTb1이 이미 있다면 삭제하고 다시 테이블을 만들어달라.

그 다음 또 테이블을 생성하고 데이터를 테이블에 넣는 SQL쿼리 구문이다.

이렇게 하면 테이블에 buy테이블과 user테이블이 생긴다.

user테이블은 고객 정보가 있다. 그리고 buy테이블은 구매정보가 있다.

여기에 foreign key가 들어가 있다. 이 상태에서  

INSERT INTO buyTbl (userID, prodName, groupName, price, amount) VALUES('STJ', '운동화', '의류', 30, 2)

이 값을 맨 아래 넣어보도록 한다.

에러가 발생하는 모습을 확인할 수 있다.

이 에러를 메모장에 복붙하여 자세히 보면

외래키 제약사항을 준수하지 못하였다. 라고 써져있다. 이처럼 외래키를 쓰면 데이터를 넣는데도 특정한 조건이 갖춰줘야 데이터를 넣을 수 있다.

 

이를 올바르게 고치려면

 일단 이 구문이 먼저인데, buy테이블에서는 이런 식으로  primary key는 primary key라고 쓰고, 

외래키를 해석해보면 FOREIGN KEY의 user id가 user 테이블에 있는 userid를 참조한다.

그리고 REFERENCES 뒤에는 다른 테이블에서 참조할 컬럼을 작성한다.

그러면 두 테이블이 서로 연결된 상태가 된다.

 

왜 연결을 시켰는가??? BUY테이블에 

이런 해당 정보를 넣을건데, 누가 샀는지를적어두고 싶다. 그런데 누가 샀는지 

위의 정보를 넣으면 굉장히 중복스럽다. 

그래서 어짜피 비교적 잘 변하지 않는 정보(나이, 주소, 전화번호와 같은)들은 별도의 테이블로 만들어 둔것이다.

 

이 외래키를 하는 이유는 데이터의 중복성을 최소화하여 저장공간을 아끼기 위함이다.

그래서 테이블을 두 개를 만드는이유는 개인정보 테이블을 구매정보 테이블과 함께 넣으면 개인정보가 너무 많이 중복되어서 별도로 구매정보 테이블을 만들어 주고, 외래키와 기본테이블의 기본키를 연결시켜주어서 해당 상세 정보를 알 수 있게 끔 한 것이다.

 

그래서 위에 오류가 난 이유는 해당 userid의 값은 위 user테이블에 없는 값이라서 참조할 수 없었다. 

 

즉 외래키의 역할은????

두 테이블 간의 데이터가 정확하게 들어가 있게끔 제약을 가하는 것이다.

외래키를 넣을 때도 두 테이블 간에 데이터가 정확한지 두 테이블 간에 문제 없는지 체크하고 넣어야 한다.

꼭 필요한 경우에만 foreign키를 넣는다.

 

INSERT INTO buyTbl (userID, prodName, groupName, price, amount) VALUES('LSG', '운동화', '의류', 30, 2);

이거는 실행이 가능하다.

이유는 userid에 대한 데이터가 user테이블에 들어가 있기 때문이다.

다른 데이터 추가시 오류가 발생하지 않게 하려면 이렇게 데이터를 추가해야 한다. ▼

 

이런 제약조건은 데이터를 추가할 때 뿐만 아니라 데이터를 삭제할 때도 적용이 된다.

DELETE FROM userTbl WHERE userID = 'STJ';

이렇게 하면 오류가 발생한다.

왜냐하면 buytable에 stj가 담긴 행이 usertbl에 stj를 참조하고 있다.

이렇게 참조하고 있는 데이터가 있는 상태에서 삭제를 하게 된다면 데이터의 정확성이 깨진다.

 

이때는 참조하고 있는 buy테이블에서 해당 데이터를 삭제한 후 usertable의 userid를 삭제해야 한다.

 

즉, 참조받고 있는 데이터를 참조하고 있는 데이터가 삭제되어야만 참조받고 있는 데이터 삭제가 가능하다.

 

이렇게 하면 비로소 삭제가 가능하다.

이처럼 데이터의 정확성을 보장하기 위해서 외래키를 쓰는 경우가 있다.

외래키를 쓰면 두 테이블 간의 데이터를 넣을 때도 제약이 있고, 삭제할때도 제약이 있다.

 

 

정리
외래키를 쓰면 두 테이블간의 정확성을 보장해주지만 제약사항이 추가 또는 삭제할때 발생할 수 있다.
이를 사용하는 이유는 긴 컬럼을 쓰면 복잡하니 두 테이블이 간략한 컬럼을 만들고 테이블 간 서로 연결시켜주어 참조하는 방식으로 하여 간단하게 테이블을 만들기 위함이다.

FOREIGN KEY 참조할컬럼 REFERENCES 참조할테이블(참조할컬럼)

 

'SQL' 카테고리의 다른 글

INNER JOIN, OUTER JOIN  (0) 2023.08.28
HAVING  (0) 2023.08.28
[실전] GROUP BY, AS, ORDER BY  (0) 2023.08.28
[실전] LIMIT, COUNT, DISTINCT, 집계함수  (0) 2023.08.25
[더 알아가기]MySQL관리를 위한 SQL이해  (0) 2023.08.25