본문 바로가기

DATABASE/CONSTRAINT : 제약조건

03. 중복되지 않는 값 UNIQUE

UNIQUE 제약 조건은 열에 저장할 데이터의 중복을 허용하지 않을 때 사용한다. NULL은 값이 존재하지 않음을 의미하기 때문에 중복 대상에서는 제외된다. 즉 UNIQUE 제약 조건을 지정한 열에 NULL은 여러 개 존재할 수 있다. UNIQUE 지정 방법은 NOT NULL과 동일하다. 

 

테이블을 생성하며 제약 조건 지정

UNIQUE 제약 조건 역시 CREATE문으로 테이블을 생성할 때 사용할 수 있다.

CREATE TABLE TABLE_UNIQUE(

    LOGIN_ID VARCHAR2(20) UNIQUE,

    LOGIN_PWD VARCHAR2(20) NOT NULL,

    TEL VARCHAR2(20) );

 

제약 조건 확인

USER_CONSTRAINTS 데이터 사전에서 CONSTRAINT_TYPE열 값이 U이면 UNIQUE이다!

 

중복을 허락하지 않는 UNIQUE

UNIQUE 제약 조건을 지정한 LOGIN_ID열은 중복 값이 저장되지 않는다.

INSERT INTO TABLE_UNIQUE

VALUES('TEST_ID_01','1234','010-1234-5678'); >> 데이터가 모두 들어간다

INSERT문을 한번 더 실행시키면 LOGIN_ID열에 중복된 값이 들어가므로 UNIQUE 제약조건에 위배된다.

 

UNIQUE 제약 조건과 NULL 값

UNIQUE 제약 조건은 열 값의 중복은 허용하지 않지만 NULL 저장은 가능하다. NULL은 존재하지 않는 값 또는 해당 사항이 없다는 의미로 사용되는 특수한 값이므로 NULL과 NULL을 비교했을 때 값이 같은지를 확인할 수 없다. 즉 NULL은 데이터 중복의 의미를 부여할 수 없다. 따라서 UNIQUE 제약 조건이 지정된 열에는 NULL이 여러개 존재할 수 있다.

INSERT INTO TABLE_UNIQUE

VALUES(NULL,'1234','010-2345-6789'); >> LOGIN_ID가 비어있고 나머지는 정상적으로 들어간 모습

 

UPDATE문을 사용하여 LOGIN_ID열에 이미 존재하는 값을 지정할 경우는 실행 후 중복 데이터가 발생하므로 실행되지는 않는다.

UPDATE TABLE_UNIQUE

SET LOGIN_ID = 'TEST_ID_01'

WHERE LOGIN_ID IS NULL ; >> 제약조건 위반

 

테이블을 생성하며 제약 조건 이름 지정

UNIQUE 제약 조건 역시 제약 조건 이름을 지정할 수 있으며 미지정하면 오라클이 자동으로 지정한다.

CREATE TABLE TABEL_UNIQUE2 (

LOGIN_ID VARCHAR2(20) CONSTRAINT TBLUNQ2_LGNID_UNQ UNIQUE,

LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLUNQ2_LGNPWD_NN NOT NULL,

TEL VARCHAR2(20) );

 

이미 생성한 테이블에 제약 조건 지정

ALTER명령어로 이미 생성되어 있는 테이블에 UNIQUE 제약 조건을 추가할 수 있다.

ALTER TABLE TABLE_UNIQUE

MODIFY(TEL UNIQUE); >> 중복키가 있어서 제약조건 추가 불가능

 

하지만 UPDATE문으로 TEL열의 모든 값을 NULL로 수정한 후에 다시 ALTER문을 실행하면 제대로 실행된다.

(혹은 NULL이 아닌 중복 값만 바꾸고 ALTER문을 실행해도 제대로 실행 가능하다)

UPDATE TABLE_UNIQUE SET TEL = NULL; >> UNIQUE는 NULL 중복은 따지지않는다.

ALTER TABLE TABLE_UNIQUE MODIFY(TEL UNIQUE); >> 제약조건 추가됨

 

생성한 테이블에 제약조건 이름 지정하거나 바꾸기

ALTER TABLE TABLE_UNIQUE2

MODIFY (TEL CONSTRAINT TBLUNQ_TEL_UNQ UNIQUE);

 

ALTER TABLE TABLE_UNIQUE2

RENAME CONSTRAINT TBLUNQ_TEL_UNQ TO TBLUNQ2_TEL_UNQ;

 

제약조건 삭제

UNIQUE 제약 조건 삭제 역시 ALTER 명령어에 DROP CONSTRAINT키워드를 사용한다.

ALTER TABEL TABLE_UNIQUE2

DROP CONSTRAINT TBLUNQ2_TEL_UNQ;