SQLite | 인덱스(Index) | UNIQUE 인덱스 생성


인덱스의 대상이 되는 테이블의 컬럼에 저장되는 값은 중복된 값이 포함되어 있어도 상관 없지만, 중복 값을 허용하지 않도록 설정할 수도 있다. 이러한 인덱스를 유니크(Unique) 인덱스라고 한다. 여기에서는 유니크 인덱스 사용에 대해 설명한다.

UNIQUE 인덱스 생성

UNIQUE 인덱스를 작성하는 형식은 다음과 같다.

CREATE UNIQUE INDEX 인덱스명 ON 테이블명 (컬럼명1, 컬럼명2, ...);

대상이 되는 컬럼에 중복된 값이 포함되어 있으면 유니크 인덱스는 만들 수 없다. 또한 유니크 인덱스를 생성한 후에 유니크 인덱스의 대상인 컬럼에 이미 저장되어 있는 값과 동일한 데이터는 테이블에 추가할 수 없다.

여러 컬럼의 조합하여 인덱스를 작성하는 경우에는 각각의 컬럼에서 중복된 값이 포함되어 있어도 지정된 모든 컬럼 값의 조합이 중복되지 않으면 유니크 인덱스를 만들 수 있다.

그러면 실제로 유니크 인덱스를 생성해 보자. 먼저 다음과 같이 테이블을 만든다.

create table user (name text, old integer, address text);
sqlite> create table user (name text, old integer, address text);
sqlite> 

INSERT 문을 사용하여 다음과 같이 데이터를 추가한다.

insert into user values ('devkuma', 28, 'Seoul');
insert into user values ('kimkc', 22, 'Busan');
insert into user values ('araikuma', 32, 'Seoul');
insert into user values ('happykuma', 23, 'Seoul');
sqlite> insert into user values ('devkuma', 28, 'Seoul');
sqlite> insert into user values ('kimkc', 22, 'Busan');
sqlite> insert into user values ('araikuma', 32, 'Seoul');
sqlite> insert into user values ('happykuma', 23, 'Seoul');
sqlite> 

그러면 생성한 테이블에 name 컬럼을 대상으로 유니크 인덱스를 만들어 보자. name 컬럼에는 현재 중복된 값이 포함되어 있지 않으므로 name 컬럼을 대상으로 한 유니크 인덱스를 만들 수 있다.

create unique index nameindex on user (name);
sqlite> create unique index nameindex on user (name);
sqlite> 

유니크 인덱스가 생성되었다.

생성된 유니크 인덱스의 대상이 되는 컬럼에는 이미 저장되어 있는 것과 같은 값을 가지는 데이터를 추가할 수 없다. 예를 들어, 다음과 같은 데이터를 추가하려고하면 “Error: UNIQUE constraint failed: user.name” 오류가 발생한다.

insert into user values ('devkuma', 18, 'Busan');
sqlite> insert into user values ('devkuma', 18, 'Busan');
Error: UNIQUE constraint failed: user.name
sqlite> 

다만, NULL는 유니크 인덱스가 생성되는 컬럼에도 여러 데이터 중복 저장할 수 있다.

또한 address 컬럼에 중복된 값이 포함되어 있다. 이러한 중복 값을 가지는 컬럼을 대상으로 유니크 인덱스를 만들려고하면 Error:UNIQUE constraint failed: user.address 오류가 발생한다.

create unique index nameindex2 on user (address);
sqlite> create unique index nameindex2 on user (address);
Error: UNIQUE constraint failed: user.address
sqlite> 

UNIQUE 인덱스와 테이블의 컬럼에 대한 PRIMARY KEY 제약 조건 / UNIQUE 제약 조건과의 관계

테이블의 컬럼에 PRIMARY KEY 제약 조건UNIQUE 제약 조건을 설정할 수 있다.

컬럼에 PRIMARY KEY 제약 조건 및 UNIQUE 제약 조건을 설정한 경우의 동작은 대상의 컬럼에 UNIQUE 인덱스를 작성하는 경우와 매우 비슷하며 SQLite는 공식 사이트에 다음과 같은 내용이 있다.

In most cases, UNIQUE and PRIMARY KEY constraints are implemented by creating a unique index in the database. (The exceptions are INTEGER PRIMARY KEY and PRIMARY KEYs on WITHOUT ROWID tables.) Hence, the following schemas are logically equivalent:

  1. CREATE TABLE t1(a, b UNIQUE);

  2. CREATE TABLE t1(a, b PRIMARY KEY);

  3. CREATE TABLE t1(a, b);
    CREATE UNIQUE INDEX t1b ON t1(b);

PRIMARY KEY 제약 조건은 테이블에 하나 밖에 설정할 수 없는 반면, UNIQUE 제약 조건과 UNIQUE 인덱스는 같은 테이블에 여러 설정하거나 생성할 수 있다. 다만, 동작이 유사하더라도 설정 목표는 다르기 때문에 적절한 설정을 할 수 있도록 한다.