[Oracle] 오라클 컬럼 CHECK 제약조건 추가, 삭제 방법

오라클에서 테이블 칼럼의 값을 특정 조건으로 제한하고 싶을 때는 CHECK 제약조건을 사용한다. ALTER TABLE 명령어를 통해 기존 테이블에도 CHECK 제약조건을 추가하거나 삭제할 수 있다. CHECK 제약조건이 추가된 이후에 해당 조건을 위반하는 값을 INSERT 하거나 UPDATE 하려고 하면 "ORA-02290: 체크 제약조건이 위배되었습니다" 오류가 발생한다.

 

목차

 

컬럼 CHECK 제약조건 추가 방법

ALTER TABLE scott.emp ADD CONSTRAINT sal_ck CHECK(sal > 0);

 

ALTER TABLE  [스키마명].[테이블명] ADD CONSTRAINT [제약조건명] CHECK([제약조건])

 

위의 CHECK 제약조건( sal > 0 )을 설정하면 sal 칼럼에 0 이하의 값이 입력되면 오류가 발생한다.

제약조건명( sal_ck )은 사용자가 임의의 이름을 부여하면 된다.

 

 

여러 개의 CHECK 조건을 부여할 때 주의 사항

 

CHECK(job = 'MANAGER' AND sal > 0) 조건을 보면 MANAGER이고 sal 값이 0 이상만 허용하는 의미로써 겉으로 보면 논리적으로 보인다. 그러나 MANAGE가 아닌 경우 모두 FALSE를 반환하므로 데이터에 문제가 발생할 수 있다.

 

위의 예제는 아래와 같이 사용하면 오류가 발생하지 않는다.

-- job = 'MANAGE'일 때만 sal > 0 체크 (OR 연산자를 사용하여 하나만 만족해도 TRUE)
ALTER TABLE scott.emp ADD CONSTRAINT sal_ck CHECK (job != 'MANAGER' OR sal > 0);

-- job != 'MANAGE'일 경우 FALSE가 발생하는데, NOT사용하여 TRUE 반환
ALTER TABLE scott.emp ADD CONSTRAINT sal_ck CHECK(NOT(job = 'MANAGER' AND sal <= 0));

 

컬럼 CHECK 제약조건 제거 방법

ALTER TABLE scott.emp DROP CONSTRAINT sal_ck;

 

ALTER TABLE  [스키마명].[테이블명] DROP CONSTRAINT [제약조건명]

 

테이블 생성 시 CHECK 제약조건 설정 방법

CREATE TABLE scott.emp 
( 
    empno       NUMBER(4)  NOT NULL,
    ename       VARCHAR2(10),
    job         VARCHAR2(9),
    mgr         NUMBER(4),
    hiredate    DATE,
    sal         NUMBER(7,2) CHECK (sal > 0),
    comm        NUMBER(7,2),
    deptno      NUMBER(2)
)

 

테이블을 사용할 때 CHECK 제약조건을 설정할 수 있다. 위의 방법은 CHECK 제약조건명을 설정하지 않았으므로 제약조건명을 오라클에서 임의로 부여한다. (예, SYS_C0012345)

 

CREATE TABLE scott.emp 
( 
    empno       NUMBER(4)  NOT NULL,
    ename       VARCHAR2(10),
    job         VARCHAR2(9),
    mgr         NUMBER(4),
    hiredate    DATE,
    sal         NUMBER(7,2) CONSTRAINT sal_ck CHECK (sal > 0),
    comm        NUMBER(7,2),
    deptno      NUMBER(2)
)

 

위의 방법은 CHECK 제약조건을 설정할 때 제약조건명을 명시하여 설정하는 방법이다. 

 

CREATE TABLE scott.emp 
( 
    empno       NUMBER(4)  NOT NULL,
    ename       VARCHAR2(10),
    job         VARCHAR2(9),
    mgr         NUMBER(4),
    hiredate    DATE,
    sal         NUMBER(7,2),
    comm        NUMBER(7,2),
    deptno      NUMBER(2),
    CONSTRAINT sal_ck CHECK (sal > 0)
)

 

CHECK 제약조건은 컬럼명 뒤에 설정해도 되지만 CREATE TABLE 구문의 하단에 입력해도 동일하게 제약조건이 생성된다.

 

 

댓글

Designed by JB FACTORY