* 관계형 데이터베이스라고 하면 임의의 데이터베이스 내에 존재하는 여러 테이블들이 서로 관계를 가지며 운영된다는 것을 의미한다. "데이터의 무결성을 설정한다"의 의미와 같다. 처음 데이터베이스 설계하는 과정 가운데서 테이블 사이의 관계를 분명하게 설정하고 그에 대한 제약조건들을 사용하여 각각의 테이블에 저장되는 데이터 또는 테이블에 적용하는 것을 말한다. 결국 이러한 제약조건의 사용은 데이터베이스 내에 보다 정확하고 분명한 데이터들을 가질 수 있도록 해주는 기능을 제공한다. 오라클에서 부여해줄 수 있는 제약 조건은 크게 4가지이다.
* Not null 제약 조건 * Primary key 와 Foreign key 제약 조건 * Unique 제약 조건 * Check 제약 조건 |
* Not null 제약 조건
-> Null 값은 "알 수 없는 값"을 의미하며 관계형 데이터베이스에서 중요한 역할을 한다. 아래의 student 테이블을 생성하는 경우를 보면, s_id 컬럼에 대하여 현재 Not null 제약 조건을 설정해준 상태라는 것을 알 수 있다. 이처럼 Not null이 설정된 컬럼에는 반드시 어떤 데이터이든 들어가야만 Not null 조건을 만족하게 된다. 이후에 만약 s_id 컬럼에 비어있는 데이터가 들어가게 되면 에러를 발생하게 된다. 이처럼 Not null 제약 조건이 설정되어 있지 않은 컬럼들은 데이터가 입력되지 않는다 하더라도 아무 문제가 발생하지 않는다.
* Primary key 와 Foreign key 제약 조건
-> 컬럼 이름을 주의해서 봐야 한다. 지금 하고 있는 작업은 2개의 테이블 관계를 설정하는 방법이다. Primary key와 Foreign key의 중요한 개념을 알아야 한다. 먼저 student 테이블의 첫 번째 컬럼을 보면 s_id라는 컬럼을 찾을 수 있다. s_id는 각각의 로우 정보들을 대표하는 값들로 되어있다. 다시 말해서 student 테이블에서 s_id 컬럼 값들을 아무리 찾아봐도 중복된 값은 존재하지 않는다. 이것이 Primary key에 관한 기본적인 조건이다. dept 테이블의 경우에도 마찬가지로 적용된다. 결국 Primary key는 어떤 로우 전체를 대표할 수 있는 컬럼에 부여되는 제약 조건이 되는 셈이다. 참고로 Primary key에 포함되지 않는 컬럼들은 functionally dependent 컬럼이라고 부른다. dept_id는 dept 테이블에서 Primary key로서 이미 설정되어진 상태이다. student 테이블 중간 부분에 dept_id 컬럼이 존재하고 있는데 dept 테이블에서 Primary key로 설정된 dept_id 컬럼에 저장된 값들로부터 나온 것이라고 보면 된다. student 테이블의 dept_id 컬럼에 저장된 모든 값들은 dept 테이블에 저장되어 있는 dept_id 컬럼 값의 부분집합이라고 말할 수 있다. Foreign key는 이처럼 한 테이블에서의 Primary key가 다른 임의의 테이블에서 Primary key 아니면 functionally dependent 컬럼 가운데 하나에 해당하는 dept_id 컬럼이 Foreign key로서 설정된 상태이다.
-> 두 개의 테이블의 관계를 Primary key와 Foreign key의 개념으로 연관(Join)시키고 있다. 추가로 이러한 Primary key/Foreign key 관계가 있을 때 Primary key가 설정된 테이블을 Parent 테이블이라고 하며 Foreign key가 설정된 테이블을 Child 테이블이라고 한다. 각 테이블간의 관계를 연관시킴으로써 궁극적으로 SQL 문장을 사용하여 수월한 데이터 처리를 가능케 하자는 것이 바로 데이터 테이블 간의 관계를 설정하고 계획하는 목적이다.
* Foreign key 제약조건을 사용할 때 적용 가능한 키워드 -> References : 해당하는 Parent 테이블의 테이블 이름과 컬럼을 설정한다. -> On delete cascade : 만약 Parent 테이블의 로우 데이터가 삭제되는 경우 자동적으로 Child 테이블의 로우 데이터 값이 삭제된다. -> On delete set null : 만약 Parent 테이블의 로우 데이터가 삭제되는 경우 자동적으로 Child 테이블의 로우 데이터 값이 Null 값으로 변환된다. |
-> 만일 On delete cascade 또는 On delete set null 옵션을 사용하지 않고 테이블을 생성하게 되면 여전히 Foreign key에 해당하는 로우 데이터가 Child 테이블에 존재하는 한 Parent 테이블의 Primary key에 해당하는 값은 삭제할 수 없다. 지금까지 Child 테이블에서 임의의 컬럼에 Foreign key를 설정할 때 항상 Parent 테이블에서 Primary key가 설정되어 있는 것만을 고려했는데 사실상 Foreign key 컬럼이 될 수 있는 자격은 반드시 Primary key가 설정된 컬럼만 존재하는 것은 아니라는 점이다. Unique 제약 조건이 설정된 컬럼 역시도 Child 테이블에서 Foreign key 컬럼으로서 설정이 가능하다는 점에 유의해야 한다. 사실상 대부분 Foreign key를 생각하면 반드시 Primary key 만을 고려하곤 하는데 잘못된 생각이다. Parent 테이블의 컬럼에 저장된 데이터의 유일성만 보장된다면 어떤 Parent 테이블에서의 컬럼도 Child 테이블에서도 Foreign key로서 설정이 가능하다.
* Unique 제약 조건
-> Primary key와 마찬가지로 Unique 제약 조건이 정의된 컬럼에 있는 데이터들은 중복될 수 없이 유일하여야 한다. 그렇다면 Primary key와 크게 구별되지 않는데 차이점은 있다. Unique key 제약 조건은 해당하는 컬럼이 Null value를 가질 수도 있다.
Primary key에 해당하는 컬럼은 절대로 비어 있을 수가 없지만 (Not null 상태) Unique key에 해당하는 컬럼은 비어 있을 수도 있다. |
-> deptno 10은 이미 등록되어져 dept 테이블에 현재 저장되어 있기 때문에 누군가가 이미 등록된 다른 deptno를 사용해서 등록하려는 경우에는 에러가 발생한다.
-> 새로운 아이디 (deptno=60)를 가지고 등록을 하게 되면 Unique 제약 조건을 위반하지 않게 되기 때문에 문제없이 데이터가 추가될 수 있다.
* Check 제약 조건
->Check 제약 조건은 임의의 컬럼에 저장될 데이터 값들에 대하여 데이터로서 유효한지 여부를 확인한다. 실무에서 자주 사용되는 제약 조건이므로 유의하여 봐야 한다. 실무에서는 데이터베이스 내에 불필요한 데이터들을 저장하는 경우에 전체 시스템에 영향을 줄 수도 있기 때문에 컬럼의 정의를 내릴 때부터 컬럼에 들어가게 될 데이터에 대하여 Check 제약 조건을 부여하는 경우가 많다.
-> 현재 Sal이 적어도 0보다 큰 값이 저장되어지도록 Check 제약 조건을 설정했다. Sal이 0보다 큰 값을 사용하면 아무 문제없이 추가가 가능하다.
'Operating System > ORACLE' 카테고리의 다른 글
[ORACLE] 뷰(View)를 통한 로우 데이터의 갱신과 추가 (0) | 2022.02.18 |
---|---|
[ORACLE] 뷰(Simple 뷰, Complex 뷰) (0) | 2022.02.14 |
[ORACLE] 데이터 잠금 (Locking) (0) | 2022.02.10 |
[ORACLE] 커밋(Commit)과 롤백(Rollback) (0) | 2022.02.09 |
[ORACLE] DML (With Check Option) (0) | 2022.02.08 |