데이터베이스 - 제약조건 종류

제약 조건 종류

not null 조건

not null 제약 조건은 해당 칼럼에 대해서 null값이 입력되지 않도록 제한한다. 그리고 not null 제약 조건의 경우에는 칼럼 수준에서만 이를 지정할 수 있다.




두 개의 제약조건을 만들고, 테이블을 생성하였다. 이 때, s_name에 대해서는 not null이라는 제약을 걸면서 제약조건의 이름을 정하지 않았지만, s_hiredate에 동일하게 not null이라는 제약조건을 걸지만 이에 대해서 이름을 지정해주었다.

이제 데이터를 삽입해보겠다. 먼저 정상적인 데이터를 삽입해본다.

다음은 제약조건에 어긋나는 데이터를 삽입해 보겠다.

이제 제약 조건에 대해서 user_constraints 테이블로부터 가져와보도록 하자.

하나의 제약 조건은 sys_c0010321이라는 이름으로 저장되어 있고, 나머지 하나는 sawon_s_hiredate_nn이라는 우리가 지정해준 이름으로 제약 조건이 저장되어 있다. 전자의 경우 이것이 무엇을 의미하는 제약 조건인지 알 수 없기 때문에 관리하는데 어려움이 있다.


따라서 제약 조건의 이름을 지정해주는 것이 관리하는데 유리하다. 게다가 제약조건의 타입이 C로 설정되어 있는데, 이는 뒤에서 배우겠지만 check 조건을 의미한다.



unique 조건

unique 제약조건은 칼럼에 중복된 값이 입력되지 않도록 제한한다. unique 조건을 연습하기 위해서 다음처럼 테이블을 하나 만들자. 이 때 부서번호에 대해서 unique 제약조건을 걸어둔다.


그리고 이를 확인하기 위해 다음처럼 행 데이터들을 삽입해보자.
중복된 부서번호 입력 시 제약 조건 위배라는 오류 메시지가 출력되고 있음을 확인할 수 있다.


이렇게 중복된 데이터에 대해서는 unique 조건이 적용되고 있는데, null값에 대해서는 어떨까?
부서 번호가 null 행 데이터를 두 개 삽입했다. null이라는 것은 중복 검사의 대상으로 적용되지 않는 것을 확인할 수 있다.


그렇다면 null값도 들어올 수 없고, 중복도 허가되지 않도록 하려면 어떻게 해야 할까?


이를 위해 사용하는 것이 바로 primary key이다.


primary key 조건
primary key는 unique와 not null 조건을 모두 충족해야 한다. 이를 연습하기 위해 다음처럼 테이블을 하나 만들어주자.


먼저 행 데이터들을 삽입할 때, unique 조건이 적용되고 있는지를 살펴보도록 하겠다.
20이라는 중복된 부서번호에 대해서 다음과 같이 unique 조건을 위배함에 따라 오류 메시지가 출력되고 있다.


다음은 not null 조건에 대해서 확인해 보겠다. null값을 삽입해보자.
이 때 역시 오류 메시지를 출력하고 있다. 따라서 primary key를 통해 not null과 unique 조건이 잘 적용되고 있음을 알 수 있다.

foreign key 조건
foreign key는 관계형 데이터베이스에서 관계된 테이블 간의 연결을 담당한다. 먼저 foreign key를 연습하기 위해서 다음처럼 테이블을 하나 만들어주자.


foreign key를 가지고 있는 테이블을 생성할 때 해당 foreign key가 참조하는 테이블이 존재하지 않는다면 이를 먼저 검사하고 다음과 같은 오류를 출력해준다.


우리가 만든 테이블에 대해서 제대로 제약조건이 만들어졌는지 확인해보자.
이 때, R은 reference를 의미하며, foreign key 타입을 말한다.


이제 foreign key가 어떻게 동작하는지 살펴보자.


먼저 우리가 참조할 테이블을 살펴보면, 10번과 20번 두 가지 부서번호가 존재한다. 따라서 우리는 행 데이터를 입력할 때 10번 또는 20번만 입력을 할 수 있다. 위의 예시처럼 30을 입력해보자. 그러면 우리가 만들어준 제약조건을 위배하였다고 오류가 출력된다.


다시 20번 데이터에 대해서 입력하면, 아무 문제 없이 행이 만들어진다.


foreign key는 update를 통해서 수정할 때 역시 적용된다. 참조하는 테이블에 존재하지 않는 30번 부서로 변경해보도록 하겠다.
다음처럼 오류 메시지가 출력된다.


참조 테이블에 존재하는 20번 부서로 수정할 경우에는 다음처럼 수정이 잘 이루어지고 있음을 확인할 수 있다.




삭제 시에는 제약 조건 상관 없이 삭제가 이루어진다.


만약에 참조하는 데이터를 삭제하면 어떨까?
다음처럼 참조되는 데이터의 경우에는 삭제가 불가능하다.


물론 참조하는 자식 데이터가 존재하지 않는다면 이 역시 삭제하는데 문제 없다.


수정할 때 역시 마찬가지로 적용된다.


테이블 자체를 삭제할 때 역시 참조하는 데이터의 영향을 받는다. 직원 테이블이 참조하는 부서 테이블을 삭제해보도록 하겠다.
이처럼 참조하는 데이터가 존재한다면 오류 메시지를 출력한다.


따라서 테이블 삭제 시에는 이러한 테이블간의 관계를 해제 해야만 가능하다.


그리고 관계형 데이터베이스를 구성할 때 부모가 되는 테이블을 먼저 만들어야만 자식 테이블을 만들 수 있다.

check 조건
check 제약 조건은 데이터가 어떤 범위의 값만을 들어올 수 있도록 제한한다. 우리가 처음 배웠던 not null도 일종의 check 제약 조건 중 하나라고 할 수도 있다.


이를 연습하기 위해서 테이블을 또 하나 만들자.


number 자료형을 잘못 선언하여(number 자료형에서 앞에 인자가 뒤에 인자보다 작다) 이를 수정해주고 다시 진행하자.


그리고 제약 조건이 제대로 생성되었는지 확인해보자.
제약조건 타입은 C로 출력되는데, 위에서 not null 역시 check 제약 조건의 일부라고 언급했었다. 실제로 not null 역시 타입은 C로 출력된다.


이제 데이터를 넣어보도록 하겠다.



첫 번째 insert문에서는 데이터가 문제 없이 들어가고 있다. 하지만 두 번째 인자의 경우 sal은 0보다 크다는 조건을 위배하기 때문에 다음처럼 오류 메시지를 출력한다.

댓글

이 블로그의 인기 게시물

데이터베이스 PL/SQL - 배열과 테이블

데이터베이스 PL/SQL 변수선언

데이터베이스 PL/SQL 제어문 - 반복문