[Database/Oracle] 5. 제약조건

minj-j·2022년 10월 13일
0

Oracle

목록 보기
5/13
post-thumbnail

제약조건

  • 컬럼에 어떠한 조건을 거는 것
  • 데이터 무결성을 구현해 데이터의 신뢰성을 높인다.
  • 해당 컬럼에 조건을 걸면 해당 컬럼 또는 테이블 이용시 제약 조건을 지켜야 한다.

1. 개체 무결성

not null

  • null값을 허용하지 않는다

unique

  • 중복된 값을 허용하지 않는다. but null은 중복이 가능하다.

1-1. primary key(기본키 / pk)

  • 테이블 당 하나만 가질 수 있는 키, 해당 키를 가진 컬럼의 데이터는 중복이 불가능하다.
  • Null과 빈 문자열 또한 데이터로 올 수 없다.

아래 두 가지 형식으로 primary key를 지정할 수 있다.

CREATE TABLE 테이블명(
     컬럼명 데이터형식 PRIMARY KEY
);

CREATE TABLE 테이블명(
     컬럼명 데이터형식,
     CONSTRAINT 프라이머리키 이름 PRIMARY KEY(컬럼명)
);

2. 영역 무결성

check

  • 데이터의 값의 범위나 조건을 설정해 조건에 해당되는 데이터만 허용한다.

default

  • 아무런 데이터를 입력하지 않았을 경우 지정한 데이터가 자동으로 입력된다.

3. 참조무결성

  • 외래키 값은 null이거나 참조 릴레이션의 pk 값과 동일해야 한다.
  • 릴레이션(테이블)은 참조할 수 없는 외래키 값은 가질 수 없다.

3-1. foreign key(외래키 / fk)

  • 외부의 테이블을 참조 시키고 싶을 때 사용하는 키, 해당 키를 컬럼으로 지정해 외부 테이블의 컬럼과 연동 할 수 있다.
  • foreign key로 묶인 부모 테이블의 컬럼 또는 값은 마음대로 삭제할 수 없다.

CREATE TABLE 테이블명(
     컬럼명 데이터형식,
     CONSTRAINT 외래키명 FOREIGN KEY (적용 컬럼명)
     REFERENCES 참조테이블명 (참조테이블 내 참조할 컬럼명)
     ON DELETE CASCADE(선택 사항)
);
  • ON DELETE CASCADE : 부모테이블의 값을 삭제하면 자식 테이블의 값도 연동하여 삭제된다.
  • ON DELETE SET NULL : 부모테이블의 값을 삭제하면 자식 테이블의 값이 NULL로 바뀐다.
    ➡️ 오라클에서 update casecade는 트리거로 구현해야 한다.

4. 도메인 무결성

  • 릴레이션 내의 컬럼(튜플)들이 각 속성의 도메인에 지정된 값 만을 가져야 한다.

5. 제약조건 부여하기

제약 조건을 정의하는 방법

  1. 컬럼 레벨 정의 : 하나의 컬럼을 정의하면서 같이 제약조건을 부여한다
  • 모든 제약조건이 이 레벨에서 부여 가능하다.

  • 컬럼 레벨 제약조건 부여

create table emp(
	eno number(6) constraint emp_eno_pk primary key, #프라이머리 키를 여기서 주고있다.
	first_name varchar2(20),
	gender varchar2(2) constraint emp_gender_nn not null

);
  1. 테이블 레벨 정의 : 테이블 생성 명령어 마지막에 제약조건을 기술한다.
    not null은 컬럼 단위에서만 부여 가능 하다
  • 두개 이상의 컬럼에 하나의 제약을 주는 경우 사용한다.

  • 테이블 레발 제약조건 부여

create table emp(
	eno number(6),
	first_name varchar2(20),
	gender varchar2(2) constraint emp_gender_nn[제약조건명] not null,
	constraint emp_eno_pk[제약조건명] primary key (eno) #마지막에 pk값을 주고 있다.
);

6. 제약조건 수정하기

6-1. not null

  • 컬럼 대상 설정만 가능하다
  • not null 제약을 추가할 때는 add constraint를 쓰면 오류가 발생하기 때문에
    modify를 사용하여 수정한다.
alter table emp
modify ename_no[제약조건 명] not null; #emp 테이블의 ename 컬럼에 not null 제약조건을 추가한다.

6-2. not null 이외의 모든 제약조건

  • 제약조건을 수정하는 명령문은 없다
  • 제약조건을 수정하고자 한다면 생성된 제약조건을 삭제하고 새로운 제약조건을 추가하는 식으로 수정이 이루어져야 한다.
alter table emp
--drop constraint mgr_no_unq[제약조건 명];
--add constraint mgr_no_unq[제약조건 명] unique(mgr_no);

7. 실습

아래 사진에 따라 테이블을 생성해 보고자 한다.
실습의 제약조건 부여 기준은 테이블 단위이다(이유 : 이렇게 많이 만들었어서)

create table dept{
	deptno number(3),
    dname  varchar2(10),
    loc    varchar2(10),
    constraint deptno_pk primary key(deptno),
    constraint dname_unq unique(dname) 
}

create table sawon{
	sabun	number(3),
    saname	varchar2(10) not null,
    deptno	number(3),
    sajob	varchar2(10),
    sapay	number(10),
    sahire	date default sysdate,
    sasex	varchar2(4),
    samgr	number(3),
    constraint sabun_pk		priamry key(sabun),
    constraint deptno_fk	foreign key(deptno) references dept(deptno),
    constraint sasec_ck		check(sasex = '남자' or sasex = '여자'),
    constraint samgr_fk		foreign key(samgr) references sawon(sabun)
}

create table gogek{
	gobun	number(3),
    goname	varchar2(10),
    gotel	varchar2(14),
    gojumin	varchar2(14),
    godam	number(3),
    constraint gobun_pk		primary key(gobun),
    constraint gojumin_uq	unique(gojumin),
    constraint godam_fk		foreign key(godam) references sawon(sabun)
}

🌼

profile
minj-j`s Development diary!

0개의 댓글