② UNIQUE
UNIQUE 제약조건은 말 그대로 해당 컬럼에 들어가는 값이 유일해야 한다는 의미다. 즉 중복 값을 허용하지 않는다.
컬럼명 데이터타입 UNIQUE
혹은
CONSTRAINTS 제약조건명 UNIQUE(컬럼명, ...)
UNIQUE 제약조건 역시 데이터베이스 객체이므로, 컬럼 정의 부분에 UNIQUE를 명시하거나 별도로 CONSTRAINTS 키워드를 사용해 정의할 수 있다. UNIQUE와 NOT NULL을 같이 명시하면 해당 컬럼에 들어오는 값은 유일함은 물론 반드시 입력해야 한다. 또한 NULL 허용 컬럼에도 UNIQUE 제약조건을 붙일 수 있다.
입력
CREATE TABLE ex2_7 (
COL_UNIQUE_NULL VARCHAR2(10) UNIQUE,
COL_UNIQUE_NNULL VARCHAR2(10) UNIQUE NOT NULL,
COL_UNIQUE VARCHAR2(10),
CONSTRAINTS unique_nm1 UNIQUE ( COL_UNIQUE)
);
결과
table EX2_7이(가) 생성되었습니다.
입력
SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX4_7';
결과
CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME SEARCH_CONDITION
--------------- --------------- ------------ -------------------------------
SYS_C0011299 C EX2_7 "COL_UNIQUE_NNULL" IS NOT NULL
SYS_C0011300 U EX2_7
SYS_C0011301 U EX2_7
UNIQUE_NM1 U EX2_7
UNIQUE 제약조건 3개가 만들어졌다. UNIQUE_NM1제약조건은 CONSTRAINTS 키워드를 사용해 제약조건명을 명시해서 만들었으므로 UNIQUE_NM1이란 이름으로 생성됐음을 확인할 수 있다. 그럼 데이터를 입력해 보자.
입력
INSERT INTO ex2_7 VALUES ('AA', 'AA', 'AA');
결과
1개 행 이(가) 삽입되었습니다.
입력
INSERT INTO ex2_7 VALUES ('AA', 'AA', 'AA');
결과
SQL 오류: ORA-00001: 무결성 제약 조건(ORA_USER.SYS_C0011300)에 위배됩니다.
입력
INSERT INTO ex2_7 VALUES ('', 'BB', 'BB');
결과
1개 행 이(가) 삽입되었습니다.
COL_UNIQUE_NULL 컬럼에 NULL이 성공적으로 입력되었다.
입력
INSERT INTO ex2_7 VALUES ('', 'CC', 'CC');
결과
1개 행 이(가) 삽입되었습니다.
좀 이상하다. COL_UNIQUE_NULL은 NULL 허용 컬럼이기는 하지만 UNIQUE 제약조건이 붙었으므로 중복 입력되지 않아야 하는데 입력되었다. 왜 입력된 것일까? NULL은 값이 없음을 의미하므로, UNIQUE 비교 대상에서 NULL은 제외된다는 점을 기억해 두자.