주니어 기초 코딩공부/Database 기초

13장 데이터 무결성_NOT NULL, UNIQUE, PK, FK 정의 및 상세 설명 (SQL_오라클)

jju_developer 2022. 12. 19. 19:15
728x90

✔ 데이터 무결성이란?

데이터의 무결성이란, 데이터베이스 내에 데이터의 확장성을 유지하는 것입니다.

데이터는 신뢰성이 있어야겠죠?

그렇게 위해서는 데이터 무결성 제약 조건이 있습니다!

 

오라클에서 사용하는 제약 조건은 테이블의 특정 칼럼에 지정합니다.

제약 조건 지정 방식에 따라서 기존 데이터의 수정이나 삭제 가능 여부도 영향을 받습니다.

✔ 데이터 무결성 제약 조건(Data Integrity Constraint Rule)이란?

테이블을 생성할 때 부적절한 자료가 입력되는 것을 방지하고,

데이터 베이스 안에 있는 데이터의 정확성을 위해서

지켜야 하는 규칙입니다.

 

 

5 가지 제약조건을 소개하겠습니다.

no 무결성 제약 조건 역할
1 NOT NULL 값이 꼭 있어야 합니다!!
NOT NULL = 데이터가 꼭 있어야함.
2 UNIQUE 중복 된 값을 허용하지 않고 항상 유일한 값을 갖도록 합니다.
3 PRIMARY KEY (기본키) 널을 허용하지 않은 동시에 중복을 허용하지 않습니다.
용도: ROW(행) 의 데이터를 식별하기 위함입니다.

NOT NULL+ UNIQUE


예를들어 사원번호가 같으면 같은 사원이기 때문에 같은 사원이 두명이 들어가는 것을 막고, 꼭 있어야 하는 값이기 때문에
이때 사원번호에 PRIMARY KEY를 사용합니다.

4 FOREIGN KEY (외래키) 다른 테이블의 컬럼 데이터를 참조하기 위함입니다.

관계형 데이터 베이스 (RDBMS) 에서 테이블간의 관계를 정의하기 위해
기본키를 다른 테이블의 외래키로 복사하는 경우 외래키가 생성됩니다.
외래키 지정 시 참조 무결성 제약 옵션을 선택할 수 있습니다.

외래 키는 다른 릴레이션(테이블)의 기본키(PRIMARY KEY)를 참조하는 칼럼(속성) 또는 이러한 속성들의 집합이다. 
여기서의 외래 키 값은 참조하고 있는 릴레이션의 기본키에 없는 내용을 참조할 수 없으며NULL 값을 가질 수 있다. 
이를 참조 무결성(Referential Integrity)이라고 한다. 
이러한 외래 키는 다른 릴레이션과의 관계를 표현할 때 사용한다.

우선 외래키는 기본키와는 다르게 테이블의 속성 바로 옆에 선언할 수 없으며, 모든 테이블 속성 명시 후 선언할 수 있다. 코드는 아래와 같다.

CREATE TABLE CLIENTJOIN(
ID VARCHAR2(
40)
CONSTRAINT PK PRIMARY KEY,
PW VARCHAR2(
40),
INFONO NUMBER 
UNIQUE,
-- 외래키는 이름을 같게 해주는게 일반적이다.
CONSTRAINT FK_INFONO FOREIGN KEY(INFONO)
REFERENCES CLIENTINFO(INFONO) );

PRIMARY KEY와 FOREIGN KEY는 짝을 이루고 있습니다.

 

 

✔ 제약조건 확인하기

제약조건(CONSTRAINTS)의 에러 메시지에 대한 정확한 원인을 알기 위해서는 USER_CONSTRAINTS의 

데이터 딕셔너리를 활용합니다.

 

✔제약조건명(Contraints_Name), 제약조건 유형(Constraint_Type), 제약조건이 속한 테이블명(Table_Name)

 

select constraint_name, constraint_type, table_name
from user_constraints

 

no CONSTRANINT_TYPE 의미
1 P PRIMARY KEY
2 R FOREIGN KEY
3 U UNIQUE
4 C CHECK NOT NULL

✔ 데이터 무결성 제약 조건 예시

 

 

<NOT NULL 제약조건>

not null의 예시 -jju_developer-


<UNIQUE 제약조건>

UNIQUE 설명-> 오류난 코드입니다!! -jju_developer-

부가설명: UNIQUE를 설정하였을 때,

C1, C2, C3, C4끼리는 값이 겹쳐도 상관없지만

다음 행을 삽입할 때 내가 설정한 C1 부분에 중복이 들어가게 된다면

값은 삽입되지 않고 오류를 내게 됩니다!!

현재 위에서 첫 번째로 INSERT 한 값이 AABD입니다.

그렇다면 C3, C4에는 NOT NULL로만 설정을 했으니까

C3과 C4에는 중복된 값을 INSERT 할 수 있을까요???

이렇게 했을 때 

오류 보고 -
ORA-00001: unique constraint (SCOTT.TEMP_UNIQUE) violated

라고 뜹니다!

 

그 이유는 

이렇게 C3, C4를 NOT NULL로 지정 후 

그 밑에 CONSTRAINT를 사용하여 UNIQUE 한 값으로 묶어 줬기 때문에

C3, C4에도 중복을 허용하지 않는 것입니다.

 

※UNIQUE는 NULL은 들어갈 수 있고 여러개가 들어 갈 수 있기 때문에 조심해야 합니다!!!

 

EMPNO에 UNIQUE 설정함 -jju_developer-


<PRIMARY KEY 제약조건>

PRIMARY KEY -jju_developer-

PRIMARY KEY로 지정한 C1은 널 값과 중복을 허용하지 않습니다!!!

 

PRIMARY KEY -> UNIQUE + NOT NULL

UNIQUE -> NULL이 여러 번 들어감

 

 

 


 <외래 키(FOREIGN KEY) 제약조건>

우선 참조의 무결성은 테이블 사이의 관계에서 발생하는 개념이므로

외래 키의 정의에 맞게 관계를 맺을 릴레이션(테이블)이 존재해야 합니다.

jju_developer

요구사항: 사원은 회사 내에 존재하는 부서에 소속되어야 한다.

 

 테이블을 생성하기에 앞서 데이터베이스 모델링 과정에서 업무를 분석한 후 얻어낸

테이블의 관계(개체와 관계)를 다이어그램으로 나타낸 것입니다.

(ERD, Entity Relationship Diagram)

 

부서 객체(ENTITY)는 소속이라는 관계가 그려집니다.

사원 객체도 소속이라는 관계가 그려집니다.

여기서의 객체는 OBJECT가 아닌 ENTITY입니다.

jju_developer

 외래 키(FOREIGN KEY) 제약조건은 사원 테이블의 부서 번호는 반드시 부서 테이블에 존재하는 부서 번호를 참조 가능하도록 하는 것입니다.(참조의 무결성)

부모 테이블에는 60이라는 부서가 없기 때문에 

EMP06의 테이블에서는 60 부서를 추가하려고 하게 된다면 오류가 발생하게 됩니다!!!

<오류>

명령의 105 행에서 시작하는 중 오류 발생 -
INSERT INTO EMP06 VALUES (1010, 'JJ', 'HR',60)
오류 보고 -
ORA-00001: unique constraint (SCOTT.EMPNO_PK) violated

 

 


<CHECK와 DEFAULT의 제약 조건>
 CHECK 제약 조건은 입력되는 값을 체크하여 설정된 값 이외의 값이 들어오면 오류 메시지와 함께 명령이 수행되지 못하게 하는 것이다.
 디폴트는 아무런 값을 입력하지 않았을 때 디폴트 제약의 값이 입력이 된다.

 

 

 

따로 LOC 값에 INSERT 하지 않았는데도 DEFAULT 제약 조건에 '서울'을 지정해 놓았기 때문에

내가 따로 값을 입력하지 않는다면 무조건 서울로 들어갑니다! (NULL 이 아님)

 

 

 


✔ 제약 조건의 비활성화와 CASCADE?

제약 조건에 의해 작업이 어려운 경우
 제약 조건이 설정되면 항상 그 규칙에 따라 데이터 무결성이 보장됩니다.
하지만!! 특별한 업무를 수행하는 과정에서 이러한 제약 조건 때문에 작업이 진행되지 못하는 경우가 생깁니다.

그렇기 때문에 오라클에서는 제약 조건을 비활성화시킴으로써 제약 조건을 삭제하지 않고도 제약 조건 사용을 잠시 보류할 수 있는 방법을 제공합니다.
※ 이렇게 비활성화된 제약 조건은 원하는 작업을 한 후에는 다시 활성화 상태로 만들어 주어야 합니다!

 

어떨 때 문제가 되느냐!

부모의 PK를 자식이 FK로 쓰고 는 경우를 생각해 봅시다.

즉 참조를 하고 있어서...

부모의 부서 번호 10을 지우고 싶은데

자식이 부서 10번을 쓰고 있기 때문에

부모 10은 삭제할 수가 없게 됩니다.

삭제하려면 자식의 데이터를 다 삭제하고 부모의 데이터를 삭제해야 합니다.

 

그런데!! 이때 CASECADE를 사용한다면??

TABLE을 만들 때 애초에 설정을 해도 되고, MODIFY를 해서

테이블을 수정해도 됩니다!

 

-- 비활성화 형식
ALTER TABLE table_name
DISABLE [CONSTRAINT constraint_name];

 

-- 활성화 형식
ALTER TABLE table_name
ENABLE [CONSTRAINT constraint_name];

 

-> 1.  테이블 복제하여 만들기

-> 2. 이렇게 복제를 할 때에는 제약조건은 복제되지 않으니, ALTER TABLE을 사용해서 ADD 해줘야 합니다!!

-> 다음 방법 

-> 1. 구조만 복사 후 ALTER TABLE로 비 활성화합니다.

구조만 복사
DELECT CASECADE 설정!

이렇게 하게 된다면,

부모의 레코드인 부서 10번이나 20번을 지우는 것이 가능해집니다.

이렇게 부모 테이블에 있는 부서를 지우게 된다면,

참조하고 있는 자식의 부서 10, 20의 정보도 다 삭제 되게 됩니다~!!!!

 

이 옵션을 꼭 넣어서 일일이 부모와 자식을 막 섞어가면서 지우지 않아도 됩니다.

단, 조작할 때에 부모를 지우면 자식이 지워지는 경우의 수를 생각하셔야 합니다~!

 

※ 테이블 지울 때

DROP TABLE DEPT01 CASCADE CONSTRAINTS;

를 하면 부모 테이블을 지울 수 있습니다~!

 

<참고>

CONSTRAINT_TYPE이랑 그 타입의 하는 일을 보고 싶을 때!!

ㄴ키 보는법

 

 

 

 

 

그럼 지금까지 데이터 무결성_NOT NULL, UNIQUE, PK, FK 정의 및 상세 설명이었습니다.

 

감사합니다~!

 

 

 

 

728x90