본문 바로가기
Data/Oracle

[Oracle] 데이터 무결성을 보장하기 위한 제약 조건 (Constraints)

by prinha 2020. 9. 13.
반응형

 

제약 조건 (Constraints)은 컬럼에 대한 속성 형태로 정의하지만,

엄연히 오라클 데이터베이스 객체 중 하나이며 데이터 무결성을 보장하기 위한 용도로 사용된다.

제약 조건 타입(Constraint Type)에는 NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK 등이 있다.

 

-- 1) 컬럼별 수준제약 : 컬럼마다 제약조건 따로
-- 2) 테이블 수준제약 : 컬럼을 다 만든 후 제약 코드를 쓰는것


1) NOT NULL

컬럼을 정의할 때 NOT NULL 제약조건을 명시하면 해당 컬럼에는 반드시 데이터를 입력해야 한다.

즉 반드시 값이 들어 있어야 하는 컬럼에는 NOT NULL 제약조건을 만들어 사용한다.

컬럼명 데이터타입 NOT NULL

 

CREATE TABLE ex2_6 (
       COL_NULL       VARCHAR2(10),
       COL_NOT_NULL   VARCHAR2(10) NOT NULL
);
SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_6';

출력결과

-> EX2_6 테이블의 COL_NOT_NULL 컬럼에 부여한 NOT NULL 제약조건이

SYS_C0012413이라는 이름으로 생성되었음을 알 수 있다.

 

제약조건 컬럼 속성처럼 보이지만 하나의 데이터베이스 객체이므로 고유의 이름이 있다.

별도로 이름을 명시하지 않으면 오라클에서 자동으로 생성해준다.

사용자가 생성한 제약조건은 USER_CONSTRAINTS 시스템 뷰에서 확인할 수 있다.

 


2) UNIQUE

UNIQUE 제약조건은 말 그대로 해당 컬럼에 들어가는 값이 유일해야 한다는 의미이다. (중복값 허용X)

NULL값 사용이 가능하며, 기본키와 다르게 테이블에 여러 개 생성 가능 하다.

NULL값은 값이 없음을 의미하므로 UNIQUE 비교 대상에서 제외 된다는 점을 명시해야한다.

컬럼명 데이터타입 UNIQUE
혹은
CONSTRAINTS 제약조건명 UNIQUE(컬럼명, ...)

 

CREATE TABLE ex2_7 (
    COL_UNIQUE_NULL    VARCHAR2(10) UNIQUE, -- NULL생략(기본값 NULL) PRIMARY KEY(기본값 NOT NULL)와의 차이점
    COL_UNIQUE_NNULL   VARCHAR2(10) UNIQUE NOT NULL, -- 컬럼별 수준제약
    COL_UNIQUE         VARCHAR2(10), 
    CONSTRAINTS unique_nm1 UNIQUE (COL_UNIQUE) -- 테이블 수준제약
); 
-- user_constraints 제약조건 시스템뷰를 통하여 생성된 제약조건 객체를 확인하는 구문
SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_7'; 

 

출력결과


3) PRIMARY KEY(기본키)

보통 테이블에 키를 생성했다라고 할 때 의미하는 것이 기본키이다.

기본키는 UNIQUE와 NOT NULL 속성을 동시에 가진 제약조건으로, 테이블 당 1개의 기본키만 생성할 수 있다.

컬럼명 데이터타입 PRIMARY KEY
혹은
CONSTRAINTS 제약조건명 PRIMARY KEY(컬럼명, ...)

 

-- 1) 단일키 : 테이블의 칼럼 1개를 대상으로 PRIMARY KEY 적용

CREATE TABLE ex2_8 (
    COL1   VARCHAR2(10) PRIMARY KEY, 
    COL2   VARCHAR2(10) 
); 

 

 

-- 2) 복합키 : 테이블의 칼럼 2개 이상을 묶어서 PRIMARY KEY 적용 (테이블 수준 제약으로 묶어서 사용)

CREATE TABLE EX2_8_3(
    COL1 VARCHAR2(10),
    COL2 VARCHAR2(10),
    COL3 VARCHAR2(10),
    COL4 VARCHAR2(10),
    CONSTRAINTS EE PRIMARY KEY (COL1,COL2)
);

 


4) FOREIGN KEY(외래키)

외래키는 테이블 간의 참조 데이터 무결성을 위한 제약조건이다.

반드시 참조하는 테이블이 먼저 생성되어 있어야 하며, 참조키가 참조 테이블의 기본키로 만들어져 있어야 한다.

외래키에 사용할 수 있는 컬럼의 개수는 최대 32개이다.

여러 컬럼을 외래키로 만들려면, 참조하는 컬럼과 외래키 컬럼의 순서와 개수는 같아야 한다. (=타입일치)

< NULL, NOT NULL 선택적 사용 가능>

CONSTRAINT 외래키명 FOREIGN KEY(컬럼명, ...)
REFERENCES 참조 테이블(참조 테이블 컬럼명, ...)

 

-- 기본키 테이블(먼저 생성되어야함)
CREATE TABLE parentTable(
    parentPK number primary key
);

-- 참조키 테이블(기본키 테이블이 먼저 생성되고나서 생성되어야함)
CREATE TABLE childTable(
    childPK number primary key,
    parentID number,
    foreign key (parentID) references parentTable(parentPK) -- 테이블 수준제약
);

DESC parentTable;
DESC childtable;

출력결과

 

-- ORA-02291: 무결성 제약조건(USER01.SYS_C0011229)이 위배되었습니다- 부모 키가 없습니다
INSERT INTO CHILDTABLE VALUES(1,10);

-- 기본키 테이블 칼럼에 반드시 데이터가 존재해야한다
INSERT INTO PARENTTABLE VALUES(10);
INSERT INTO PARENTTABLE VALUES(20);
INSERT INTO PARENTTABLE VALUES(30);

INSERT INTO CHILDTABLE VALUES(1,10);
INSERT INTO CHILDTABLE VALUES(2,20);
INSERT INTO CHILDTABLE VALUES(3,30);

-- ORA-00001: 무결성 제약 조건(USER01.SYS_C0011228)에 위배됩니다
-- 40이라는 데이터가 기본키 테이블에 없기때문에
INSERT INTO CHILDTABLE VALUES(4,40);

5) CHECK

컬럼의 조건에 해당하는 데이터를 입력하고자 하는 목적으로 사용되는 제약조건이다.

컬럼에 입력되는 데이터를 체크해 특정 조건에 맞는 데이터만 입력받고, 그렇지않으면 오류를 뱉어낸다.

CONSTRAINTS 체크명 CHECK (체크조건)

 

CREATE TABLE ex2_9 (
    num1     NUMBER 
        CONSTRAINTS check1 CHECK ( num1 BETWEEN 1 AND 9), -- 1~9 사이
    gender   VARCHAR2(10) 
        CONSTRAINTS check2 CHECK ( gender IN ('MALE', 'FEMALE'))  -- 데이터 포함인가?
); 

** DEFAULT : 기본값 표현(제약조건은 아님)

CREATE TABLE ex2_10 (
   Col1    VARCHAR2(10) NOT NULL, 
   Col2    VARCHAR2(10) NULL, 
   
   -- 테이블에 값을 INSERT 해주지않으면 자동적으로 값을 넣어줌 <DEFAULT>
   Create_date DATE DEFAULT SYSDATE -- 기본 NULL상태 -> 자동적으로 값 넣어줌
);

출처 및 참고 : https://thebook.io/006696/

반응형