데이터베이스/Oracle

무결성 제약 조건 (NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK)

챈박 2021. 4. 28. 13:19

 

 

 

무결성 제약 조건

                         

NOT NULL

NULL을 허용하지 않는다.

UNIQUE

중복된 값을 허용하지 않는다. 항상 유일한 값을 갖도록 한다.

PRIMARY KEY

NULL을 허용하지 않고 중복된 값을 허용하지 않는다.

NOT NULL 조건과 UNIQUE 조건을 결합한 형태이다.

FOREIGN KEY

참조되는 테이블의 칼럼의 값이 존재하면 허용한다.

CHECK

저장 가능한 데이터 값의 범위나 조건을 지정하여 설정한 값만을 허용한다.

 

FOREIGN KEY

CREATE TABLE EMP03( 
EMPNO NUMBER(4),
ENAME VARCHAR2(10) CONSTRAINT EMP03_ENAME_NN NOT NULL, 
JOB VARCHAR2(9),
DEPTNO NUMBER(4),
CONSTRAINT EMP03_EMPNO_PK PRIMARY KEY(EMPNO),
CONSTRAINT EMP03_JOB_UK UNIQUE(JOB),
CONSTRAINT EMP03_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
); 

참조하기 위해서는 상위 테이블의 해당 컬림이 기본키로 지정되어 있어야 하위 테이블에서 외래키로 참조할 수 있음 

 

CHECK 제약조건 

CREATE TABLE EMP06( 
EMPNO NUMBER(4) PRIMARY KEY,
ENAME VARCHAR2(10) NOT NULL, 
GENDER VARCHAR2(1) CHECK (GENDER IN('M', 'F'))
); 

 

컬럼레벨 방식으로 제약조건 지정하기

CREATE TABLE EMP05( 
EMPNO NUMBER(4) CONSTRAINT EMP05_EMPNO_PK PRIMARY KEY,
ENAME VARCHAR2(10) CONSTRAINT EMP05_ENAME_NN NOT NULL, 
JOB VARCHAR2(9) CONSTRAINT EMP05_JOB_UK UNIQUE,
DEPTNO NUMBER(4) CONSTRAINT EMP05_DEPTNO_FK REFERENCES DEPT(DEPTNO)
); 

 

테이블 레벨 방식으로 제약조건 지정하기

(PRIMARY KEY 같은 경우 중복으로 지정할 수 있는데 이렇게 중복으로 정의하려면 테이블 레벨 방식으로 지정해야한다)

 

▶복합키 지정

CREATE TABLE MEMBER01( 
NAME VARCHAR2(10),
ADDRESS VARCHAR2(30),
HPHONE VARCHAR2(16),
CONSTRAINT MEMBER01_COMBO_PK PRIMARY KEY(NAME, HPHONE)
); 

▶ 컬럼 레벨과 테이블 레벨 방식 둘다 사용하여 제약조건 지정

CREATE TABLE EMP03( 
EMPNO NUMBER(4),
ENAME VARCHAR2(10) CONSTRAINT EMP03_ENAME_NN NOT NULL, 
JOB VARCHAR2(9),
DEPTNO NUMBER(4),
CONSTRAINT EMP03_EMPNO_PK PRIMARY KEY(EMPNO),
CONSTRAINT EMP03_JOB_UK UNIQUE(JOB),
CONSTRAINT EMP03_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
); 

NOT NULL 은 컬럼레벨만 가능한 것 같음..

 

제약조건 추가하는 방법

ALTER TABLE DEPT03
ADD CONSTRAINT DEPT03_DEPTNO_PK PRIMARY KEY (DEPTNO);
ALTER TABLE EMP01
ADD CONSTRAINT EMP01_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO);

 

제약조건 제거하는 방법

ALTER TABLE EMP05
DROP CONSTRAINT EMP05_EMPNO_PK;

 

제약조건 확인하기

SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, SEARCH_CONDITION
FROM USER_CONSTRAINTS
WHERE TABLE_NAME='EMP03';


CONSTRAINT_NAME                                              CO
------------------------------------------------------------ --
TABLE_NAME
------------------------------------------------------------
SEARCH_CONDITION
--------------------------------------------------------------------------------
EMP03_ENAME_NN                                               C
EMP03
"ENAME" IS NOT NULL

EMP03_EMPNO_PK                                               P
EMP03


CONSTRAINT_NAME                                              CO
------------------------------------------------------------ --
TABLE_NAME
------------------------------------------------------------
SEARCH_CONDITION
--------------------------------------------------------------------------------

EMP03_JOB_UK                                                 U
EMP03


EMP03_DEPTNO_FK                                              R
EMP03

CONSTRAINT_NAME                                              CO
------------------------------------------------------------ --
TABLE_NAME
------------------------------------------------------------
SEARCH_CONDITION
--------------------------------------------------------------------------------

C -> NOT NULL이나 CHECK 제약이 걸려있음 (DESC 테이블명으로 구조파악 하면 NULL 여부가 나오므로 구분 가능 )

P -> PRIMARY KEY

U -> UNIQUE

R -> REFERENCES

(SELECT 문에 R_CONSTRAINT_NAME 를 추가하면 참조관계 확인 가능)

 

CASCADE

DROP TABLE DEPT01 CASCADE CONSTRAINTS;

CASCADE를 이용해서 참조(REFERENCES)받는(상위 테이블) 테이블이어도 제거 가능

(하위테이블은 DROP으로 바로 제거 가능)

 

 

반응형