더북(TheBook)

② 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은 제외된다는 점을 기억해 두자.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.