무결성 제약조건

데이터가 추가, 수정, 삭제되는 과정에서도 데이터의 결함 생기지 않도록 유지하는 것을 데이터 무결성이라고 하는데, DB의 데이터 무결성을 지키기 위한 수단이 바로 제약조건이다.


📍제약 조건의 종류

1. NOT NULL

2. UNIQUE

3. PRIMARY KEY = NOT NULL & UNIQUE
: 두 개로 설정한 경우 둘 다 같아야만 같은 프라이머리 키를 가진 것으로 식별된다.

ALTER table emp11
  ADD CONSTRAINT emp10_empno_ename_pk
  PRIMARY KEY(empno, ename);

4. FOREIGN KEY
: 디폴트는 참조하는 데이터들이 있을 경우 Foreign Key로 지정한 컬럼은 삭제할 수 없다.

📝 삭제하는 방법
1) 아무도 참조하지 않도록 바꾼 후 삭제
2) 제약 조건 자체를 삭제 -> 데이터 무결성에 문제가 생길 수도 있음
3) 해당 컬럼을 삭제하는 경우 이를 참조하는 모든 행을 함께 삭제

CREATE TABLE 테이블명(
	deptno NUMBER REFERENCES 참조테이블(참조컬럼명)
        ON DELETE CASCADE,
        ...
)

5. CHECK : 의도된 데이터만 입력 받기 위함

CREATE TABLE emp08(
    empno NUMBER PRIMARY KEY, --이렇게 옆에 제약조건을 바로 써주는 것을 <컬럼 레벨 방식>이라고 함
    ename VARCHAR(20) NOT NULL,
    job VARCHAR2(20),
    deptno NUMBER,
    gender char(1) CHECK(gender IN('M', 'F'))
)

6. DEFAULT : 데이터를 삽입하지 않은 경우 default로 설정한 값 삽입

CREATE TABLE emp09(
    empno NUMBER PRIMARY KEY,
    ename VARCHAR(20) NOT NULL,
    job VARCHAR2(20),
    deptno NUMBER,
    loc varchar2(20) DEFAULT 'Seoul'
)


📍제약 조건의 이름 명시하기

< 제약 조건 이름의 형식 >

테이블 이름_컬럼 이름_제약 조건
  1. 테이블 레벨 방식으로 제약 조건 이름을 명시
CREATE TABLE emp05(
    empno NUMBER,
    ename VARCHAR(20) NOT NULL,
    job VARCHAR2(20),
    deptno NUMBER,
    
    CONSTRAINT emp06_empno_pk PRIMARY KEY(empno),
    CONSTRAINT emp06_deptno_fk 
            FOREIGN KEY(deptno)
            REFERENCES departments(department_id)
)
  1. 테이블 수정 방식
    테이블 생성 후 테이블을 수정하는 방식으로 제약 조건을 추가할 수도 있는데, 이 방법을 더 많이 사용한다.
ALTER TABLE emp07
  ADD CONSTRAINT emp07_deptno_fk
  FOREIGN KEY(deptno)
  REFERENCES departments(department_id);
ALTER TABLE emp07
  MODIFY ename CONSTRAINT emp07_ename_nn NOT NULL;
ALTER TABLE emp_const
  ADD CONSTRAINT empconst_sal_chk 
  CHECK(sal BETWEEN 1000 AND 9999);
  1. 컬럼 레벨 방식으로 제약 조건의 이름 명시
CREATE TABLE DEPT_CONST ( 
   DEPTNO NUMBER(2)    CONSTRAINT DEPTCONST_DEPTNO_PK PRIMARY KEY, 
   DNAME  VARCHAR2(14) CONSTRAINT DEPTCONST_DNAME_UNQ UNIQUE, 
   LOC    VARCHAR2(13) CONSTRAINT DEPTCONST_LOC_NN NOT NULL 
);

📍제약 조건 삭제

ALTER TABLE emp10
  DROP CONSTRAINT EMP10_EMPNO_ENAME_PK;

📍쿼리를 통해 제약 조건 확인

SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE 
  FROM USER_CONSTRAINTS 
 WHERE TABLE_NAME IN ( 'EMP_CONST', 'DEPT_CONST' ) 
ORDER BY CONSTRAINT_NAME; 

좋은 웹페이지 즐겨찾기