본문 바로가기

Programing/Oracle

Oracle - CONSTRAINTS

CONSTRAINTS - 데이터의 무결성을 보장



PRIMARY-KEY : 하나의 행에서 그 행을 대표하는 컬럼이며 FOREIGN-KEY컬럼이 참조 하는 컬럼은

                      반드시  PRIMARY-KEY 컬럼이어야 한다.
FOREIGN-KEY : 입력되어야 할 값이 다른 테이블의 PRIMARY-KEY 컬럼인 컬럼
CHECK : 입력되어야 할 값이 정해져 있는경우 직접 정의 할수 있다.
UNIQUE : 컬럼의 값이 테이블 전체에서 유일한 값이어야 하는경우
NOT NULL : 컬럼에 NULL값이 입력되어서는 안되는 경우

 

 

테이블 생성


CREATE TABLE DEPT1
(DEPTNO    NUMBER PRIMARY KEY,
DNAME       VARCHAR2(20) UNIQUE,
LOC            VARCHAR2(20));


 CREATE TABLE EMP1
 (EMPNO     NUMBER(4) CONSTRAINT EMP1_EMPNO_PK PRIMARY KEY,
 ENAME      VARCHAR2(20) NOT NULL,
 SAL           NUMBER(7,2),
 DEPTNO    NUMBER,
 CONSTRAINT EMP1_SAL_CK CHECK (SAL BETWEEN 500 AND 5000),
 CONSTRAINT EMP1_DEPTNO_FK FOREIGN KEY(DEPTNO)
      REFERENCES DEPT1(DEPTNO))


SQL> --컬럼명 DATATYPE 제약종류
SQL> --DEPTNO   NUMBER PRIMARY KEY
SQL> --COLUMN LEVEL 정의 방식
SQL> --컬럼명 DATATYPE CONSTRAINT 제약명 제약종류
SQL> --컬럼명 DATATYPE [CONSTRAINT 제약명]생략가능 제약종류
SQL> --EMPNO    NUMBER(4) CONSTRAINT EMP1_EMPNO_PK PRIMARY KEY
SQL> --생략시 SYS_Cn형식으로 자동 지정,


SQL> --TABLE LEVEL 정의방식
SQL> --컬럼명 DATATYPE,
SQL> --컬럼명 DATATYPE,
SQL> --컬럼명 DATATYPE,
SQL> --CONSTRAINT 제약명 제약종류 (컬럼명)


SQL> -- DATA DICT 조회

SQL> DESC USER_CONSTRAINTS

SQL> -- 폭조정,
SQL> COL SEARCH_CONDITION FORMAT A25


SQL> SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME IN ('EMP1','DEPT1');


CONSTRAINT_NAME                C SEARCH_CONDITION
------------------------------ - -------------------------
SYS_C003005                           P
SYS_C003006                           U
SYS_C003007                           C "ENAME" IS NOT NULL
EMP1_SAL_CK                        C SAL BETWEEN 500 AND 5000
EMP1_EMPNO_PK                   P
EMP1_DEPTNO_FK                  R (레퍼런스  FOREIGN KEY)


6 개의 행이 선택되었습니다.



제약추가
SQL> ALTER TABLE DEPT1
  2  ADD CONSTRAINT DEP1_LOC_UK UNIQUE (LOC);


제약삭제


SQL> DROP CONSTRAINT DEPT1_LOC_UK

 

SQL> -- NOT NULL ==> CHECK 특수한 일종
SQL> -- NOT NULL == TABLE LEVEL 정의방식 사용 X


SQL> ALTER TABLE DEPT1
  2  MODIFY (LOC VARCHAR2(20) NOT NULL);

테이블이 변경되었습니다.

SQL> -- 스스로 변경이 안되 MODIFY에 묻어가기!


SQL> DESC DEPT1
 이름                                      널?      유형
 ----------------------------------------- -------- -------------

 DEPTNO                                    NOT NULL NUMBER
 DNAME                                              VARCHAR2(20)
 LOC                                       NOT NULL VARCHAR2(20)


SQL> -- PK == NOT NULL + UNIQUE

 

'Programing > Oracle' 카테고리의 다른 글

Oracle - INDEX  (0) 2008.07.29
Oracle - VIEW  (0) 2008.07.29
Oracle - DDL(DATA DEFINITION LANGUAGE)  (0) 2008.07.29
Oracle - DATA DICTIONARY (관리용 테이블)  (0) 2008.07.29
Oracle - join 문제  (0) 2008.07.29