유일 키

관계형 데이터베이스 관리 시스템에서 **유일 키**(unique key, 유니크 키)는 후보 키이다. 관계의 모든 후보 키는 해당 관계의 로우를 고유하게 식별할 수 있지만, 그중 하나만이 해당 관계의 기본 키로 사용된다. 나머지 후보 키들은 관계 내의 로우를 고유하게 식별할 수 있기 때문에 유일 키라고 불린다. 유일 키는 여러 개의 컬럼으로 구성될 수 있다. 유일 키는 대리 키(alternate key)라고도 불린다. 유일 키는 해당 관계의 기본 키에 대한 대안이다. SQL에서 유일 키는 중복을 방지하기 위해 `UNIQUE` 제약 조건이 할당된다(유일 컬럼에서 중복 항목은 허용되지 않는다). 대리 키는 단일 테이블 선택이나 where 절의 필터링 시 기본 키처럼 사용될 수 있지만, 일반적으로 여러 테이블을 조인하는 데는 사용되지 않는다.

## 요약

키는 데이터베이스 사용자나 응용 소프트웨어가 데이터베이스 테이블의 정보를 식별, 액세스 및 업데이트할 수 있는 수단을 제공한다. 주어진 테이블에는 여러 개의 키가 있을 수 있다. 예를 들어, 직원 테이블에서 사번과 로그인 이름은 각각 개별적으로 고유하다. 테이블에서 키 제약 조건(즉, 유일성 제약 조건)을 강제하는 것은 데이터베이스의 데이터 무결성 기능이기도 하다. DBMS는 중복된 키 값을 초래하는 업데이트를 방지함으로써 테이블이 항상 원하는 유일성 규칙을 준수하도록 보장한다. 따라서 데이터베이스를 설계할 때 키를 적절히 선택하는 것은 데이터베이스 무결성의 중요한 측면이다.

관계형 데이터베이스 테이블은 하나 이상의 사용 가능한 유일 키(공식적으로 후보 키라 함)를 가질 수 있다. 테이블당 이러한 키 중 하나를 기본 키로 지정할 수 있으며, 다른 키들은 대리 키라고 불린다.

모든 키는 하나 이상의 속성으로 구성될 수 있다. 예를 들어, 사회 보장 번호는 직원을 위한 단일 속성 키가 될 수 있고, 편명과 날짜의 조합은 예정된 비행을 위한 두 개의 속성으로 구성된 키가 될 수 있다.

데이터베이스 모델링 및 구현에 사용되는 키의 종류에는 여러 가지가 있다.

가장 기본적인 정의에 따르면 "키는 고유한 식별자"이므로, 유일 키(unique key)는 중복 표현이다. 원래 엔티티 내에 있는 키는 해당 엔티티 내에서 고유하다. 다른 테이블로 전이된 키는 설계 방식과 해당 테이블에서 어떻게 사용되느냐에 따라 고유할 수도 있고 그렇지 않을 수도 있다. 외래 키는 다른 테이블에서 기본 키가 될 수 있다. 예를 들어 PersonID는 Employee 테이블에서 EmployeeID가 될 수 있다. 이 경우 EmployeeID는 외래 키이자 유일한 기본 키이며, 이는 테이블들이 1:1 관계를 가짐을 의미한다. 사람 엔티티에 생물학적 아버지의 ID가 포함된 경우, 아버지는 한 명 이상의 자녀를 가질 수 있으므로 아버지 ID가 고유할 것으로 기대되지 않는다.

다음은 기본 키가 관련 테이블에서 외래 키가 되는 예시이다. ID가 Author 테이블에서 Book 테이블로 전이된다.


```sql
Author 테이블 스키마:

Author(ID, Name, Address, Born)

Book 테이블 스키마:

Book(ISBN, AuthorID, Title, Publisher, Price)
```


여기서 ID는 'Author' 테이블에서 기본 키 역할을 하지만, AuthorID로서 'Book' 테이블의 외래 키 역할도 한다. 외래 키는 이 샘플 데이터베이스에서 두 관련 테이블 사이의 링크, 즉 연결 고리 역할을 한다.

관계형 데이터베이스에서 후보 키는 데이터베이스 테이블의 각 데이터 값 로우를 고유하게 식별한다. 후보 키는 단일 데이터베이스 테이블 내의 단일 컬럼 또는 컬럼 세트로 구성된다. NULL 값이 사용되지 않으므로 데이터베이스 테이블의 어떤 서로 다른 두 로우나 데이터 레코드도 해당 후보 키 컬럼에서 동일한 데이터 값(또는 데이터 값의 조합)을 가질 수 없다. 설계에 따라 데이터베이스 테이블은 많은 후보 키를 가질 수 있지만, 최대 하나의 후보 키만이 기본 키로 구별될 수 있다.

키 제약 조건은 특정 시점의 테이블 내 튜플 세트에 적용된다. 키가 테이블에 저장될 수 있는 모든 가능한 튜플 인스턴스 전체에 걸쳐 반드시 고유한 식별자여야 하는 것은 아니지만, 데이터베이스 테이블에 중복이 허용되어서는 안 된다는 데이터 무결성 규칙을 함축한다. 키의 가능한 예로는 사회 보장 번호, ISBN, 차량 등록 번호 또는 사용자 로그인 이름 등이 있다.

원칙적으로 모든 키는 외래 키에 의해 참조될 수 있다. 일부 SQL DBMS는 기본 키에 대해서만 외래 키 제약 조건을 허용하지만, 대부분의 시스템은 테이블의 모든 키를 참조하는 외래 키 제약 조건을 허용한다.

## SQL에서 키 정의하기

SQL에서의 키 정의:


```sql
ALTER TABLE <table identifier>
      ADD [ CONSTRAINT <constraint identifier> ]
      { PRIMARY KEY | UNIQUE } ( <column name> [ {, <column name>}... ] )
```


마찬가지로, 키는 `CREATE TABLE` SQL 문의 일부로 정의될 수 있다.


```sql
CREATE TABLE table_name (
     id_col   INT,
     col2     CHARACTER VARYING(20),
     key_col  SMALLINT NOT NULL,
     ...
     CONSTRAINT key_unique UNIQUE(key_col),
     ...
  )
```



```sql
CREATE TABLE table_name (
     id_col  INT  PRIMARY KEY,
     col2    CHARACTER VARYING(20),
     ...
     key_col  SMALLINT NOT NULL UNIQUE,
     ...
  )
```


### 기본 키 제약 조건과 유일 제약 조건의 차이점

**기본 키 제약 조건**
# 기본 키는 null을 허용할 수 없다(null을 허용하는 컬럼에는 기본 키를 정의할 수 없다).
# 각 테이블은 두 개 이상의 기본 키를 가질 수 없다.
# 일부 RDBMS에서 기본 키는 기본적으로 클러스터형 인덱스를 생성한다.

**유일 제약 조건**
# 유일 제약 조건은 null을 허용하는 컬럼에 정의될 수 있으며, 이 경우 null을 포함하는 로우들은 제약 조건에 의해 정의된 컬럼 세트 전체에서 실제로 고유하지 않을 수 있다.
# 각 테이블은 여러 개의 유일 제약 조건을 가질 수 있다.
# 일부 RDBMS에서 유일 제약 조건은 기본적으로 비클러스터형 인덱스를 생성한다.

PRIMARY KEY 제약 조건과 달리 UNIQUE 제약 조건은 제약 조건에 참여하는 컬럼에 대해 NOT NULL을 함축하지 않는다는 점에 유의하라. 해당 컬럼을 키로 만들려면 NOT NULL을 지정해야 한다. null 허용 컬럼에 UNIQUE 제약 조건을 설정하는 것이 가능하지만, SQL 표준은 해당 제약 조건이 null 허용 컬럼의 유일성을 보장하지 않는다고 명시하고 있다(컬럼 중 하나라도 null을 포함하는 로우에 대해서는 유일성이 강제되지 않는다).

SQL 표준에 따르면 유일 제약 조건은 null이 존재할 때 유일성을 강제하지 않으므로, null과 non-null 값의 동일한 조합을 가진 여러 로우를 포함할 수 있다. 그러나 모든 RDBMS가 SQL 표준에 따라 이 기능을 구현하는 것은 아니다.

## 같이 보기
* 기본 키
* 슈퍼 키
* 후보 키
* 대리 키
* 외래 키

## 각주

분류:데이터베이스 관리 시스템
분류:데이터 모델링