오라클 테이블, 고유 키 제약조건(Unique Key Constraints)
컬럼의 값은 유일해야 한다는 제약조건입니다. 최대 32개 이내 컬럼에 정의할 수 있으며 NULL값은 항상 유일하므로 입력이 가능합니다. 컬럼 레벨, 테이블 레벨(주로 복합 컬럼으로 제약조건을 만드는 경우) 모두에서 정의할 수 있습니다. 고유 키 제약조건이 지정되면 제약조건과 같은 이름의 인덱스가 별도의 저장공간에 자동으로 생성됩니다.
테이블을 생성할 때 UNIQUE 제약조건을 기술해보고 제약조건의 이름도 부여하거나 부여하지 않고 테이블을 생성해 보겠습니다. 이 제약조건이 있을 때 중복된 데이터가 입력되는지, NULL을 허용하는 컬럼에 NULL을 INSERT구문의 VALUES절에 기술해서 입력할 수 있습니다. 또한 오라클에서 UNIQUE 제약조건을 기술할 때 별도의 영역에 해당 컬럼의 데이터를 정렬하여 인덱스를 생성한다는 것 역시 확인해 보겠습니다.
실습
UNIQUE 제약조건을 걸어 테이블을 생성 후 중복된 데이터를 입력해 봅니다.
id, name, tel 컬럼을 가지는 T2 테이블을 생성하면서 tel 컬럼에 UNIQUE 제약조건을 걸어서 데이터 입력을 테스트 하세요. |
CREATE TABLE t2 ( id NUMBER CONSTRAINT pk_t2 PRIMARY KEY, name VARCHAR2(100) NOT NULL, tel VARCHAR2(20) UNIQUE ); INSERT INTO t2 VALUES (1, '1길동', '010-1234-0000'); INSERT INTO t2 VALUES (2, '2길동', '010-1234-0000'); |
<실행결과>
ORA-00001: 무결성 제약조건(SCOTT.SYS_C007508)에 위배됩니다.
전화번호는 고유해야 하는데 이미 같은 전화번호가 있어서 오류 메시지가 발생했습니다.
실습
컬럼에 NOT NULL 제약조건이 걸려 있지 않다면 NULL을 입력할 수 있습니다. NULL값은 고유하기 때문입니다.
tel 컬럼에 NULL값을 입력하세요. |
INSERT INTO t2 VALUES (2, '2길동', NULL); INSERT INTO t2 VALUES (3, '3길동', NULL); |
실습
UNIQUE 제약조건이 정의되면 오라클은 자동으로 별도 영역에 해당 컬럼을 인덱싱해둬 검색에서 좋은 성능을 냅니다. USER_INDEXES 딕셔너리 뷰에서 사용자가 생성한 인덱스를 확인 할 수 있습니다.
USER_INDEXES에서 T2 테이블에 생성되어 있는 인덱스를 확인합시다. |
SELECT INDEX_NAME, TABLE_NAME
FROM USER_INDEXES
WHERE TABLE_NAME = 'T2';
<실행결과>
| INDEX_NAME | TABLE_NAME |
1 | PK_T2 | T2 |
2 | SYS_C007508 | T2 |
UNIQUE 제약조건을 기술할 때 별도로 이름을 주지않아 오라클에서 자동으로 SYS_C007508을 이름으로 부여했습니다. 인덱스는 활성화 또는 비활성화, 삭제 및 재생성 작업이 자주 일어나므로 이름을 부여해 주어야 관리하기 편합니다.
실습
UNIQUE 제약조건의 이름을 주고 테이블을 생성 합니다.
T2 테이블을 삭제 후 다시 생성하는데, UNIQUE 제약조건의 이름을 기술하여 생성하세요. |
CREATE TABLE T2 ( ID NUMBER CONSTRAINT PK_T2 PRIMARY KEY, NAME VARCHAR2(100) NOT NULL, TEL VARCHAR2(20) CONSTRAINTS UK_T2_TEL UNIQUE ); SELECT INDEX_NAME, TABLE_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'T2'; |
<실행결과>
| INDEX_NAME | TABLE_NAME |
1 | PK_T2 | T2 |
2 | UK_T2_TEL | T2 |
#고유키, #오라클고유키, #UniqueKey, #ORACLE, #ORACLE강좌, #ORACLE교육