다연이네

[days09] 제약조건 본문

Oracle

[days09] 제약조건

 다연  2020. 11. 10. 17:40
반응형

제약조건

- 테이블에 부여된 제약조건의 관계키는 user_constraints 뷰를 사용하여 확인할 수 있다.
- user_constraints View : 제약조건 확인
- from 테이블명 또는 뷰명


1) 제약조건을 사용하는 이유 ? 

data integrity(데이터 무결성)을 위해


  데이터 무결성이 뭔데 ?  

  ㄱ) 개체 무결성(Entity Integrity)
            --      릴레이션(=테이블)에 저장되는 튜플(=레코드,행)의 유일성을 보장
            --         속성은 칼럼
  ㄴ) 참조 무결성(Relational Integrity)
            --      릴레이션 간의 데이터의 일관성을 보장하기 위한 제약조건이다. 
            --      즉, 하나의 릴레이션에 있는 속성 값이 다른 릴레이션에 있는 속성 값을 참조하기 위해서는 
                      참조되는 속성 값이 반드시 해당 릴레이션에 존재해야 한다. 
            --      ex) 50번 부서 사원 추가
  ㄷ) 도메인 무결성(domain integrity)
            --      속성에서 허용 가능한 값의 범위를 지정하기 위한 제약조건이다. 

 

2. 제약조건 용도

  ㄱ. 주로 테이블에 행(row)을 입력, 수정, 삭제할 때 적용되는 규칙으로 사용되며

          kor number(3),      0/111/999     0~100정수 규칙을 정할 수 있다.

  ㄴ. 테이블에 의해 참조되고 있는 경우 테이블의 삭제 방지를 위해서도 사용된다.

 

3. 제약조건을 설정하는 방법

  ㄱ. 테이블 레벨 - OUT-OF-LINE constraint 방법

create table tbl_test(
seq number 
,writer varchar2(20) 
,passwd varchar2(15) 
,title varchar2(100) 
,content long
,regdate date default sysdate
,제약조건
,제약조건
,제약조건
,등등
);

- 복합키 설정할때는 꼭 테이블레벨 방식을 사용해야 한다. ( * 복합키primary key(seq, writer) )

 

1. 테이블 레벨 방식으로 제약조건 설정

create table tbl_columnlevel
(
    seq number not null
    ,id varchar(20) not null
    ,email varchar(50) not null
    ,score number(3)
    ,deptno number(2)
    ,city varchar2(50)
    --테이블 레벨 방식 
     ,constraint tbl_columnlevel_seq_PK primary key(seq) --괄호 필수
     ,constraint tbl_columnlevel_id_UK unique(id)
     ,constraint tbl_columnlevel_email_UK unique(email)
     ,constraint tbl_columnlevel_score_CK check(score between 0 and 100)
     ,constraint tbl_columnlevel_city_CK check(city in('서울','부산'))
     ,constraint tbl_columnlevel_deptno_FK foreign key(deptno) references dept(deptno)
);

 

  ㄴ. 컬럼 레벨 -  IN-LINE constraint 방법

create table tbl_test(
seq number  NOT NULL  
,writer varchar2(20) NOT NULL
,passwd varchar2(15)  NOT NULL
,title varchar2(100)  NOT NULL
,content long
,regdate date default sysdate
);

- not null 제약조건은 컬럼레벨 방식으로만 선언 가능하다.

 

컬럼 레벨일 경우에 제약조건을 설정하는 방법

   - 컬럼명 자료형 constraint 제약조건명(테이블명_컬럼명_PK)

   - seq number primary key constraint tbl_test_seq_PK primary key
   - 사용자는 무결성 제약조건의 이름을 지정할 수 있으며 지정하지 않으면 SYS_Cn 형태로 자동적으로 생성된다.
   - [constraint tbl_test_seq_PK] -> SYS_???이런식으로 이름 부여

 

2. 컬럼 레벨 방식으로 제약조건 설정

create table tbl_columnlevel
(
    seq number not null constraint tbl_columnlevel_seq_PK primary key --pk
    ,id vatchar(20) not null constraint tbl_columnlevel_id_UK unique--uk
    ,email varchar(50)not null constraint tbl_columnlevel_email_UK unique --uk
    ,score number(3) not null constraint tbl_columnlevel_score_CK check(score between 0 and 100)--0~100 ck
    ,deptno number(2)not null constraint tbl_columnlevel_deptno_FK foreign key --fk dept 테이블의 deptno 컬럼
    ,city varchar2(50) not null constraint tbl_columnlevel_city_CK check(city in('서울','부산'))
);

PRIMARY KEY, UNIQUE와 같은 제약조건은 자동으로 UNIQUE INDEX가 생성된다 

 

 

4. 제약조건 종류

  ㄱ. PK(primary key) : 기본키, nullX, 중복X, = NN+UK
  ㄴ. FK(foreign key) : 부모PK참조, null
  ㄷ. UK(unique key) : 유일성 - 주민번호, ID, 전화번호 컬럼
  ㄹ. NN(not null) : 필수입력사항
  ㅁ. CK(check) : 해당컬럼에 저장 가능한 값의 범위나 조건 지정
      --kor between 0 and 100
      --city in ('서울','경기','인천')

 

 

3. 기존에 존재하는 테이블에 제약조건 추가 PK/CK2/UK/FK 추가

create table tbl_columnlevel
(
    seq number not null
    ,id varchar(20) not null
    ,email varchar(50) not null
    ,score number(3)
    ,deptno number(2)
    ,city varchar2(50)
    
);


alter table tbl_columnlevel
add (constraint tbl_columnlevel_seq_PK primary key(seq)
     ,constraint tbl_columnlevel_id_UK unique(id)
     ,constraint tbl_columnlevel_email_UK unique(email)
     ,constraint tbl_columnlevel_score_CK check(score between 0 and 100)
     ,constraint tbl_columnlevel_city_CK check(city in('서울','부산'))
     ,constraint tbl_columnlevel_deptno_FK foreign key(deptno) references dept(deptno)
     );

 

5. 제약조건 삭제

alter table TBL_COLUMNLEVEL
drop  constraint SYS_C007115;

 

반응형
Comments