> For the complete documentation index, see [llms.txt](https://kukingclass.gitbook.io/computerscience/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kukingclass.gitbook.io/computerscience/database/undefined.md).

# 키(Key) 정리

## key 란?

테이블 내 튜플(행) 을 식별하기 위한 단일 속성 혹은 속성들의 집합을 의미한다.

## Key 의 종류

![](https://user-images.githubusercontent.com/63101979/202251869-e46364db-07b4-41a3-bdd7-b8ed95d65583.png)

```
유일성: Key 하나로 튜플을 유일하게 식별  
최소성: 꼭 필요한 속성으로만 구성
```

<br>

### 슈퍼키

* 유일성을 만족하는 키
* 어떤 속성끼리 묶던 중복값이 나오지 않고 서로 구별 가능

한 팀에 4명의 팀원이 있다. 한 학생마다 **\[ 학번, 주민번호, 이름, 나이 ]** 에 대한 정보가 있다.

![](https://user-images.githubusercontent.com/63101979/202252697-5cae8094-3e80-47e1-93b9-542b91612145.png)

이름과 나이를 합쳐서 4명을 구분할 수 있다면 슈퍼키가 될 수 있다.\
학번과 주민번호, 학번과 주민번호와 이름 각각 묶어서도 **중복값 없이 구별 가능**하다면 슈퍼키로 가능하다.

<br>

### 후보키

* 유일성과 최소성을 만족하는 키.
* 기본키가 될 수 있는 후보이기 때문에 후보키라고 불린다.

위에서 말한, 4명을 구분하기 위한 슈퍼키들 중에서 **최소한의 속성 개수**로 4명을 구분할 수 있어야 후보키가 될 수 있다.

속성 1개의 슈퍼키 : 학번, 주민번호\
속성 2개의 슈퍼키 : 이름 + 나이, 학번 + 주민번호 등 --> 최소성 만족 X

결국, 유일성을 만족하는 슈퍼키들 중 **최소성을 만족**하는 학번과 주민번호만이 후보키에 속한다.

<br>

### 기본키

* 후보키에서 선택된 키.
* NULL 값이 들어갈 수 업삳.
* 기본키로 선택된 속성은 동일한 값이 들어갈 수 없다.

테이블에는 **오직 1개의 기본키**만 지정할 수 있다.

<br>

### 대체키

* 후보 키 중에서 기본키로 선택되지 않은 키

후보키 : 학번, 주민번호\
기본키로 학번을 지정하면, 대체키는 주민번호가 된다.

학번 기본키가 없어지면, 주민번호가 없어진 기본키를 대체한다.

<br>

### 외래키

* 어떤 테이블간의 기본키를 참조하는 속성이다.
* 테이블 간 관계를 나타내기 위해 사용

![](https://user-images.githubusercontent.com/63101979/202252369-fc3d85d2-5f37-4990-9aa3-6df8cd2cd912.png)

위 사진은 학번이 외래키이다.\
부모 테이블: 학생 테이블, 자식테이블 : 수강테이블

* 학생테이블은 학번이 기본키이자 참조되는 참조키이다.
* 수강테이블은 학번이 참조하는 키이자 외래키이다.

> 참조되는 부모테이블이 먼저 생성된 뒤 데이터를 넣고, 참조하는 자식 테이블이 다음에 생긴다.
>
> 부모테이블을 먼저 삭제하는 경우 --> 부모테이블을 참조하는 자식테이블에 **외래키 오류** 발생\
> 외래키 관계에서 부모테이블을 삭제하려면 자식테이블을 먼저 삭제한 후 가능
