[sql] 제약조건

*(테이블에 저장되는)데이터에 대해서 "무결성"을 유지하기 위해 존재한다.
*무결성 : 데이터의 정확성, 일관성을 유지한다.
*종류로는 NOT NULL, UNIQUE, CHECK,기본키, 외래키 등이 있다.

UNIQUE

*기존의 데이터와 같은 데이터가 삽입되는 것을 허락하지 않는 조건입니다.
*UNIQUE조건을 설정하는 방법은 두가지가 존재합니다.
1. 테이블을 생성할 때 생성

CREATE TABE t_1(
    COL_1     VARCHAR2(10);                                    --조건 없음
    COL_2    VARCHAR2(10) NOT NULL;                  --NULL을 허용하지 않음
    COL_3    VARCHAR2(10) UNIQUE;                      --중복데이터 허용하지 않음            
                                                                                                            NULL 비교 대상에서 제외된다
    COL_4    VARCHAR2(10) UNIQUE NOT NULL;    --중복데이터, NULL을 허용하지 않음

);

2. CONSTRAINTS
*CONSTRAINTS키워드를 이용하여 (기존 만들어 놓은 테이블의)컬럼에 제약조건을 추가할 수 있다.
*CONSTRAINTS라는게 사전적으로 "제약"의 뜻을 가지고 있다

기본키( PK : Primary key )

*PK는 UNIUQE + NOT NULL 조건을 합친 것 이다.
*테이블 당 하나의 컬럼만 지정할 수 있다.

CREATE TABLE t_1(
    COL_1    VARCHAR2(10) PRIMARY KEY;        --유일하면서, NULL을 허용하지 않는다.
    COL_2   VARCHAR2(10);
);

INSERT INTO t_1 VALUSE( 'aaa', 'bbb' );             --기존 데이터

INSERT INTO t_1 VALUSE( 'aaa', 'bbb' );             --에러 : 이미 'aaa'데이터가 존재한다.

INSERT INTO t_1 VALUSE( '', 'bbb' );                  --에러 : NULL입력을 허용하지 않는다.

외래키( FK : foregin key )

*외래키를 생성해 놓으면 부서정보에 없는 부서번호를
 입력할 때 오라클은 오류를 발생시켜 잘못된 데이터가 입력되는 것을 방지한다.
 참조 무결성을 보장하는 것이다

*삭제도 마찬가지다. 사원 테이블에서 사용하고 있는 부서 정보를 부서 테이블에서 삭제하면 무결성이 깨진다. 하지만 외래키를 생성해 놓으면 부서 테이블에서 해당 부서정보를 삭제할 때 오류가 발생해 데이터 삭제를 막아 참조 무결성이 보장된다.
*부서 테이블에서 부서번호를 변경하는 것 역시 해당 부서가 참조되고 있다면 수정할 수 없다.
*
외래키에 대한 제약사항은 다음과 같다.
1 반드시 참조하는 테이블이 먼저 생성되어야 하며, 참조키가 참조 테이블의 PRIMARY KEY(혹은 UNIQUE)로 만들어져 있어야 한다.
2 외래키에 사용할 수 있는 컬럼 개수는 최대 32개다.
3 여러 컬럼을 외래키로 만들려면, 참조하는 컬럼과 외래키 컬럼의 순서와 개수는 같아야 한다.

*외래키를 만저 생상한 뒤 개발을 하지 않는다.
 시스템이 어느정도 테스트가 완료되고 안정될 때 생성한다.

CREATE TABLE t_1(
    COL_1        VARCHAR2(10),
    COL_2        VARCHAR2(10),
    FORIEGN KEY( COL_2) REPERENCE t_2( COL_2) ON UPDATE CASCADE
);
    FOGIEGN KEY( ) REPERENCE ohter table( column ) condition

ON DELETE, ON UPDATE

1. CASCADE : 참조되는 테이블에서 데이터를 삭제하거나
                       수정하면, 참조하는 테이블에서도 삭제와 수정이 같이 이루어집니다.
2. RESTRICT : 참조하는 테이블에 데이터가 남아 있으면, 
                       참조되는 테이블의 데이터를 삭제하거나 수정할 수 없습니다.
                       --RESTRICT : 제한하다.
3. SET NULL : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 NULL로 변경됩니다.
4. NO ACTION : 참조되는 테이블에서 데이터를 삭제하거나 수정해도, 참조하는 테이블의 데이터는 변경되지 않습니다.
5. SET DEFAULT : 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 필드의 기본값으로 설정됩니다.


CREATE TABLE category(
    분류     VARCHAR2(10),
    이름     VARCHAR2(100)
);

CREATE TABLE t_1(
    COL_1       INT,
    COL_2      VARCHAR2(10),
    COL_3      VARCHAR2(10),

    FORIEGN KEY( COL_2 ) REPERENCE category ( 분류 ) CASCADE ON UPDATE,
    --category 테이블의 "분류"가 변경되면 t_1 테이블의 COL_2도 변경됩니다.
    FORIEGN KEY( COL_3 ) REPERENCE category ( 이름 ) CASCADE ON DELETE, CASCADE ON UPDATE, RESTRICT
    --category 테이블의 "이름"이 삭제되거나, 수정되면 t_1테이블의 COL_3도 삭제 혹은 수정됩니다.
    --t_1테이블의 COL_3이 남아있다면 category의 "이름"을 삭제할 수 없습니다.
);

CHECK

//추가필요

CONSTRAINTS(제약)을 이용한 제약조건 수정/추가하기

//추가필요

댓글