본문 바로가기

데이터베이스/Oracle

무결성 제약조건

데이터를 저장하는 데 있어서 데이터베이스는 일관성을 유지하고, 중복을 제거하는 등 데이터의 신뢰도를 유지해야 한다. 따라서 데이터의 삽입, 삭제, 수정 시 여러 가지 제약조건이 따른다.

 

※ 제약조건의 정리

구분 도메인
도메인 무결성 제약조건 개체 무결성 제약조건 참조 무결성 제약조건
제약 대상 속성 튜플 속성과 튜플
같은 용어 도메인 제약
(domain constraint)
기본키 제약
(primary key constraint)
외래키 제약
(foreign key constraint)
해당되는 키 - 기본키 외래키
NULL 값 허용 불가 허용
릴레이션 내
제약조건의 개수
속성의 개수와 동일 1개 0~여러 개
기타 튜플 삽입/수정 시
제약사항 우선 확인
튜플 삽입/수정 시
제약사항 우선 확인
튜플 삽입/수정 시 제약사항 우선 확인
부모 릴레이션의 튜플 삽입/수정 시
제약사항 우선 확인

무결성 제약조건 : 결점 없는 데이터를 위한 제약조건을 설정할 수 있다
1. UNIQUE : 중복안됨
2. NOT NULL : null포함 안됨
3. PRIMARY KEY : unique + not null
4. CHECK : 특정값만 포함(ex.0보다 커야한다/1~5 사이만 넣어야한다)
5. FOREGIN KEY : 부모엔티티의 PK를 참조 (부모엔티티의 컬럼값만 참조할 수 있고, 다른 값 넣을 수 없다)
모든 컬럼에 제약조건 다 안해도 된다. 필요에 따라서만 하면 됨

 

CREATE TABLE t_b(
    id varchar2(5), --아이디 값이 저장 PRIMARY KEY
    pwd varchar2(5), --비밀번호 NOT NULL
    name varchar2(30), --이름
    email varchar2(30), --이메일 UNIQUE
    status number(1) --상태 -1:탈퇴, 0:휴면, 1:활동중인 상태 CHECK
)
id1 p1 n1 id1@a.com 1
id2 p2 n2 id2@a.com 1
id3 p3 ' ' id3@a.com 1
id4 p3 n2 ' ' -1

이 릴레이션에서 행을 구분해주는 식별자 컬럼은? 

후보키 : id, email
기본키 : 그 중에서 최종선정된 id값

 

기본키에 해당하는 컬럼에는 PRIMARY KEY 제약조건 설정
이메일 null이 들어가도 되지만 중복되지 않게 = UNIQUE 제약조건 설정

 

1)제약조건설정방법
 (1) 테이블레벨 제약조건 설정하기
      테이블에 필요한 컬럼을 다 만들고 제약조건만 따로 나열

CREATE TABLE t_b(
    id varchar2(5),
    pwd varchar2(5),
    email varchar2(30),
    status number(1),
    CONSTRAINT t_b_id_pk PRIMARY KEY(id),
    --t_b_id_pk : 제약조건 이름부여(테이블명+컬럼명+제약조건 종류)
    CONSTRAINT t_b_email_uq UNIQUE(email),
    CONSTRAINT t_b_status_ck CHECK(status IN (-1, 0, 1))
);

 (2) 컬럼레벨 제약조건 설정하기 : NOT NULL 제약조건은 반드시 컬럼레벨로만 제약조건 설정해야 한다.

CREATE TABLE t_b(
    id varchar2(5) CONSTRAINT t_b_id_pk PRIMARY KEY,
    pwd varchar2(5)	(CONSTRAINT t_b_pwd_nn) NOT NULL,  -- 저 부분 생략 가능
    email varchar2(30) CONSTRAINT t_b_email_uq UNIQUE
    status number(1) CONSTRAINT t_b_status_ck CHECK(status IN (-1, 0, 1))
);

 (3) 이미 테이블이 생성되어 있는 경우(데이터도 있는 경우) 테이블 구조변경으로 제약조건 추가한다

CREATE TABLE t_b(
    id varchar2(5),
    pwd varchar2(5),
    email varchar2(30),
    status number(1)
); -- 이미 만들어져있음
	
--테이블레벨 제약조건을 추가하는 것일뿐이다.
ALTER TABLE t_b
ADD CONSTRAINT t_b_id_pk PRIMARY KEY(id);
	
ALTER TABLE t_b
ADD CONSTRAINT t_b_email_uq UNIQUE(email)
ADD CONSTRAINT t_b_status_ck CHECK(status IN (-1, 0, 1));
	
ALTER TABLE t_b
MODIFY pwd NOT NULL; --테이블 레벨로 설정못한다, 컬럼을 변경하면서 제약조건을 설정

테이블레벨 제약조건을 권장한다.

'데이터베이스 > Oracle' 카테고리의 다른 글

무결성 제약조건 예제  (0) 2023.08.22
스키마  (0) 2023.08.22
데이터 제어 언어  (0) 2023.08.22
서브쿼리 예제  (0) 2023.08.22
서브쿼리(SubQuery) (2)  (0) 2023.08.22