티스토리 뷰

SQL

[SQL] 19. 제약(Constraint)

superkong1 2018. 2. 17. 17:09
반응형

19. 제약(Constraint)

제약(Constraint)이란 Data의 품질을 높이기 위한 Database Object라할 수 있으며,
제약 조건을 사용하여 잘못된, 적절하지 않은 데이터를 입력하는 일을 방지한다.

일명 '빅데이터'라 부를 수준의 양까지 데이터의 수가 많아졌을 때,
어울리지 않거나 잘못된 데이터가 하나만 있어도 상당히 비효율적인 업무를
수행해야하는 문제가 있어 보통 Table 생성 시 제약을 많이 사용한다.

흔히 사용하는 제약 조건과 설명은 아래 표를 통해 요약해놓았다.


NOT NULL, UNIQUE, PRIMARY KEY 제약

이름에서 알 수 있듯이 각각 null 불가, 중복 불가함을 규정하는 제약이다.
Primary key는 null과 중복 불가 모두를 규정하는 제약이다.

어떻게 사용하는지 예제를 통해 알아보자.

예제) 사원의 이름(ename)과 직원번호(empno)가 있는 테이블 emp123을 만드는데
이름은 중복 불가하게, 직원번호는 null이 될 수 없도록 제약을 사용하시오!

create table emp123
(ename varchar2(20) UNIQUE, empno number(20) NOT NULL ) ;

이후 아래의 Data를 insert한다면
insert into emp123 values('adam', 001); ← 이상없음

insert into emp123 values('adam', 002); ← 에러(동일한 사원명)

insert into emp123 values('cindy', ''); ← 에러(null 삽입 불가)


⊙제약 이름을 확인하는 방법⊙

select table_name, constraint_name, constraint_type, status
from user_constraints
where table_name= 'EMP123';
반드시 대문자로 작성

제약이름(CONSTRAINT_NAME)을 지정해주려면 처음 제약을 걸 때
"constraint 제약명 제약종류" 의 형태로 제약을 걸어주면 된다.



Foreign Key 제약

Foreign Key는 공통적인 Data가 있는 테이블간에 부모/자식 테이블의 관계를 만들어줘
부모 테이블에 없는 Data는 자식테이블에 넣지 못하게 하는 제약이다.

예제) 사원(emp)테이블에 있는 부서번호(deptno)에 Foreign Key를 걸면서
dept 테이블에 deptno를 참조(부모로 삼으라)하라고 하시오!

alter table emp
add constraint emp_deptno_fk foreign key(deptno)
references dept(deptno)
;
→ emp_deptno_fk라는 foreign key 유형의 제약을 deptno에 거는데
dept 테이블의 deptno를 참조(부모로 삼아라)해라!

제약 열람 시, 어떤 컬럼(변수)에 대한 제약이라는 사항이 나오지 않아
보통 제약명으로 어떤 컬럼(변수)에 걸은 어떠한 유형의 제약이라는 것을 명시한다.


이러면 이제 emp 테이블의 deptno는 dept 테이블의 deptno에 있는 값인
10, 20, 30, 40 이외에는 입력할 수 없게 된다.

insert into emp(empno, ename, sal, deptno)
values(2934, 'JACK', 4500, 70 ) ; ← dept 테이블의 deptno에 70이 없어 데이터 입력 불가


⊙기존 Table의 제약을 생성/삭제/변경하는 방법⊙

ⓐ 생성: alter table 테이블 명 add constraint 제약명 제약형태(컬럼);
ⓑ 삭제: alter table 테이블 명 drop constraint 제약명;
→ 제약명을 미리 알고 있어야 한다.

ⓒ 변경
a) 기존 제약 중지(삭제하지않고 잠깐 멈추는 것)
alter table 테이블명 disable constraint 제약명 ;
→ 제약 정보 확인해보면 status(상태)가 DISABLED로 변경되어 있음

b) 기존에 중지되어있는 제약 활성화
alter table 테이블명 enable constraint 제약명 ;
→ 제약에 위반된 data가 이미 들어가 있다면 오류가 뜨면서 제약 활성화가 불가하다.

그럼에도 불구하고 제약을 활성화시키고 싶다면 novalidate를 추가하면 된다.
alter table 테이블명 enable novalidate constraint 제약명 ;



Check 제약

Check 제약은 조건으로 지정된 Data 외의 다른 Data의 입력을 막는 제약이다.

예제) 사원이름(ename), 월급(sal)이 있는 emp0012 테이블을 생성하는데
sal의 값이 0~3,000 사이의 값만 입력되겠금 check 제약을 거시오!

create table emp0012
( ename varchar2(20),
sal number(10) constraint emp0012_sal_check check( sal between 0 and 9000 ) ) ;
→ constraint 제약명 check( 변수 조건 ) ;


이후 월급이 3,001인 데이터를 입력하려면 오류가 발생한다.
insert into emp0012 values('Den', 3001 ) ;

조건은 in, and, or, like, instr, != 등 where절에 쓰는 것과 동일하게 사용할 수 있다.

=================이 글은 Markdown을 활용해 작성하였습니다=================

반응형

'SQL' 카테고리의 다른 글

[SQL] 21. Unpivot  (0) 2018.02.20
[SQL] 20. With절, 임시 테이블  (3) 2018.02.19
[SQL] 18. 정규식 함수  (0) 2018.02.14
[SQL] 17. index  (0) 2018.02.13
[SQL] 16. Sequence, Synonym  (0) 2018.02.12
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함