SQLite | 테이블 (Table) | UNIQUE 제약 조건

컬럼에 저장하는 값으로 이미 저장되어 있는 데이터의 값과 중복 값을 입력되지 않도록 하고 싶은 경우, 컬럼에 UNIQUE 제약 조건을 설정한다. 여기에서는 UNIQUE 제약 조건 사용에 대해 설명한다.

UNIQUE 제약 조건이란?

컬럼에 UNIQUE 제약 조건을 설정하면 대상의 컬럼에 중복 된 값이 저장될 수 없다. UNIQUE 제약 조건을 컬럼에 설정하는 형식은 다음과 같다.

CREATE TABLE 테이블명 (컬럼명 UNIQUE, ...);

그러면 실제로 제약 조건을 설정해 보자. 먼저 다음과 같이 테이블을 만든다. id 컬럼에 UNIQUE 제약 조건이 설정되어 있다.

create table user (id integer unique, name text);
sqlite> create table user (id integer unique, name text);
sqlite> 

그러면 데이터를 추가해 보자.

insert into user values (1, 'devkuma');
insert into user values (2, 'kimkc');
insert into user values (4, 'araikuma');
sqlite> insert into user values (1, 'devkuma');
sqlite> insert into user values (2, 'kimkc');
sqlite> insert into user values (4, 'araikuma');
sqlite> 

다음은 UNIQUE 제약 조건이 설정되어 있는 id 컬럼의 값으로 이미 저장된 데이터와 같은 값을 설정한 데이터를 추가해 본다. 그러면 “Error: UNIQUE constraint failed: user.id"라는 오류 메시지가 표시된다.

insert into user values (2, 'happykuma');
sqlite> insert into user values (2, 'happykuma');
Error: UNIQUE constraint failed: user.id
sqlite>

이렇게 UNIQUE 제약 조건을 컬럼에 설정하는 것으로, 중복된 값이 컬럼에 저장될 수 없게 된다.

다만 UNIQUE 제약 조건이 설정되어 있어도 NULL은 중복하여 저장할 수 있다.

insert into user values (null, 'mykuma');
insert into user values (null, 'yourkuma');
sqlite> insert into user values (null, 'mykuma');
sqlite> insert into user values (null, 'yourkuma');
sqlite> 

컬럼에 NULL을 포함하는 것을 허용하지 않으려면 NOT NULL 제약 조건을 설정하면 된다.

여러 컬럼의 조합에 UNIQUE 제약 조건을 설정

UNIQUE 제약 조건을 단일 컬럼뿐 아니라, 여러 컬럼의 조합에 UNIQUE 제약 조건을 설정할 수 있다. 형식은 다음과 같다.

CREATE TABLE 테이블명 (컬럼명1, 컬럼명2, ... , UNIQUE (컬럼명1, 컬럼명2, ...));

예를 들어 2개의 컬럼을 대상으로 UNIQUE 제약 조건을 설정하면 각각의 컬럼의 값은 중복도 상관 없지만 2개의 컬럼 값의 조합과 같은 조합의 값을 저장하려고 하면 오류가 발생한다.

그러면 실제로 제약 조건을 설정해 보자. 먼저 다음과 같이 테이블을 만든다. no 컬럼과 unit 컬럼 쌍으로 UNIQUE 제약 조건이 설정한다.

create table employee (no integer, unit text, name text, unique (no, unit));
sqlite> create table employee (no integer, unit text, name text, unique (no, unit));
sqlite> 

우선 몇개의 데이터를 추가한다.

insert into employee values (1, 'Sales', 'devkuma');
insert into employee values (4, 'Dev', 'kimkc');
insert into employee values (2, 'Office', 'araikuma');
sqlite> insert into employee values (1, 'Sales', 'devkuma');
sqlite> insert into employee values (4, 'Dev', 'kimkc');
sqlite> insert into employee values (2, 'Office', 'araikuma');
sqlite> 

다음은 no 컬럼의 값만 기존의 데이터와 동일한 데이터와 unit 컬럼의 값만 기존의 데이터와 동일한 데이터를 추가해 본다. 이번에는 단일 컬럼의 값이 기존 데이터와 동일하지만 에러는 없다.

insert into employee values (4, 'Design', 'mykuma');
insert into employee values (7, 'Sales', 'yourkuma');
sqlite> insert into employee values (4, 'Design', 'mykuma');
sqlite> insert into employee values (7, 'Sales', 'yourkuma');
sqlite> 

다음은 no 컬럼과 unit 컬럼 값의 조합이 기존의 데이터와 동일한 데이터를 추가해 본다. 그러면 UNIQUE 제약 조건이 설정되어 있기 때문에 “Error: UNIQUE constraint failed: employee.no, employee.unit"라는 오류 메시지가 표시된다.

insert into employee values (2, 'Office', 'blackkuma');
sqlite> insert into employee values (2, 'Office', 'blackkuma');
Error: UNIQUE constraint failed: employee.no, employee.unit
sqlite> 

이와 같이 하나의 컬럼에 대해서뿐만 아니라 여러 컬럼의 조합에 대해서도 UNIQUE 제약 조건을 설정할 수 있다.




최종 수정 : 2019-11-13