학원/오라클-학원

Constraint(제약조건)**

수풀속의고라니 2022. 3. 22. 17:47
728x90

- 제약조건은 굉장히 중요하며 그 중에서도 pk가 중요

 

 

- NN / CK / UK / PK / FK

- 조건 : 값을 넣을 때(INSERT, UPDATE 등) 조건을 걸어놓으면 조건에 해당하는 값 외에는 입력이 불가

(EX 남, 여를 컬럼에 넣을 때 M,F외에는 값을 넣을 수 없도록 할 수 있음)

- 중복은 허용하지 않고, NULL값은 허용

- 1,3을 합친 것으로 중복되지 않으면서 NULL값도 허용하지 않는 것

(위에선 EMPNO에 걸어서 중복되거나 NULL값이 없는 데이터만 넣을 수 있도록 할 수 있음)

- 왼쪽 데이터의 DEPTNO를 FK로 오른쪽의 DEPTNO에 걸어놓으면 

 

 

 

- 이렇게 만들어진 테이블에 제약조건 추가 가능

 

 

- 제약조건 변경

- 변경을 했지만 제약조건 탭에서 확인을 해보면 그냥 추가된 것으로 확인할 수 있음

- NOT NULL값의 경우에는 ADD로 하면 추가가 되지 않고, MODIFY로 해야 추가가 됨 

 

 

- 유니크 오류

- NO가 PK인데 이미 1이 있는 상태에서 또 NO 1을 넣어줬기 때문

 

 

- 이런 쿼리로 제약조건을 죽이면 강제로 중복되는 데이터를 집어넣을 수 있음

- 저 TV_NO_PK가 PK값을 가진 제약조건이었음

- 다시 저 제약조건을 살리기 위해선 강제로 넣은 중복 데이터를 삭제해야 살릴 수 있음

 

 

- 중복 데이터를 삭제한 이후에 저 쿼리를 작성하면 다시 제약조건이 살아나게 됨

 

데이터 사전

 

- 2개의 데이터 사전을 합쳐서 제약조건, 컬럼 이름, 등을 한번에 볼 수 있음

- 이 쿼리는 CONSTRAINT_TYPE가 프라이머리키인 경우를 볼 수 있음

- 타입을 R로 두면 FOREGIN KEY 타입인 경우를 볼 수 있음

- 테이블에서 알고자 하는 컬럼이나 제약조건을 한번에 모두 볼 수 있음

 

 

- IN을 사용하면 여러개의 제약조건을 한번에 넣어서 확인할 수 있음

 

<예제>

 

- 테이블 생성할 때 제약조건을 주면서 생성

 

 

- CHECK로 STU_ID가 5자리가 되어야 한다고 걸었는데 위의 쿼리가 그냥 들어가게 됨

- A를 살펴보면 공백이 4자리가 들어간 것을 알 수 있음

- 이제 위의 테이블을 삭제하고 제약조건을 수정해 다시 만든다.

 

 

- 제대로된 학생 테이블 생성

- 이렇게 TRIM까지 사용해서 공백을 잘라내야 공백 포함 5자리가 아니라 실제 5자리를 입력해야 값이 삽입되는 제약조건을 줄 수 있음

 

 

- 과목 테이블 생성

 

 

- 학생 테이블과 과목 테이블에 FOREIGN KEY를 걸어서 점수 테이블을 생성

- 학생 아이디와 과목 아이디를 넣을 때 제약조건으로 설정한 두 테이블의 컬럼에 데이터가 존재해야 삽입이 가능함

 

 

 

- 이렇게 제약조건에 걸리지 않는 데이터를 입력시킬 수 있음

- 앞의 2자리로 STU_ID와 SUB_ID를 2개의 테이블과 비교해서 제약조건 확인

- 뒤의 2개는 3자리의 정수인지, A,B,C,D,F의 점수 중에서 설정되었는지를 확인

 

 

- 이렇게 STUDENT99를 삭제하려 하면 오류가 발생

- 그 이유는 SCORE99 테이블에서 FOREIGN KEY를 통해서 데이터를 참조하고 있기 때문

- SUBJECT99테이블 역시 마찬가지

- SCORE99의 삭제는 자유롭게 가능

- 즉, 위의 생성 방식에서는 자식 쪽에서는 삭제가 자유롭지만 부모키 쪽에서는 삭제가 안됨

 

 

- 제약조건에 ON DELETE CASCADE를 주고 다시 테이블을 생성

- 이러한 방식으로 테이블을 생성하면 FK로 참조하고 있는 테이블이 있어도 참조대상 테이블을 삭제가 가능함

- STUDENT99와 SUBJECT99 테이블의 데이터를 삭제 가능하며 이를 참조하던 테이블인 SOCRE99역시 데이터가 삭제됨

 

- 그래서 삭제를 아예하지 못하게 만들거나 삭제가 가능하면서 자식 테이블의 데이터까지 삭제 시키느냐로 방향을 정해서 테이블을 생성할 수 있음

728x90