[Oracle] 제약 (constraint) 2
예제 1. 사원 테이블의 월급이 0~9000 사이의 데이터만 입력 또는 수정되게끔 check 제약 걸기
alter table emp
add constraint emp_sal_ck check(sal between 0 and 9000);
예제 2. email 에 체크 제약을 거는데, 이메일에 @ 와 . 이 없으면 에러가 나게끔 제약 걸기
alter table emp
add constraint emp_email_ck check(email like '%@%.%');
alter table emp
add constraint emp_email_ck check(email like '%@%' and email like '%.%');
예제 3. 통신사 컬럼에 제약을 거는데 데이터가 sk, lg, kt 만 입력 또는 수정되게끔 제약 걸기
alter table emp
add constraint emp_telecom_ck check(telecom in ('sk', 'lg', 'kt'));
dept 테이블의 deptno 에 primary key 제약을 걸고 emp 테이블의 deptno 에 foreign key 제약을 걸면
emp 테이블의 deptno 에 데이터를 입력할 때, dept 테이블에 존재하는 deptno 에 대한 데이터만 입력 또는 수정할 수 있다.
dept 테이블의 데이터를 지울 때 emp 테이블에 관련된 부서 번호가 있다면, 해당 부서 번호는 에러가 나면서 지워지지 않는다.
자식 테이블인 emp 테이블에 해당 부서 번호가 없어야만 지워진다.
예제 4. dept 테이블의 deptno 에 primary key 제약 걸기
alter table dept
add constraint dept_deptno_pk primary key(deptno);
예제 5. emp 테이블의 deptno 에 foreign key 제약을 걸면서 dept 테이블의 deptno 를 참조
alter table emp
add constraint emp_deptno_fk foreign key(deptno) references dept(deptno);
이렇게 하게 되면 dept 테이블은 부모 테이블이 되고, emp 테이블은 자식 테이블이 된다.
예제 6. KING 의 부서 번호를 70번으로 변경
update emp
set deptno = 70
where ename = 'KING';
무결성 제약조건(C##SCOTT.EMP_DEPTNO_FK)이 위배되었습니다- 부모 키가 없습니다.
위의 update 문은 dept 테이블의 deptno 에 70번이 없기 때문에 에러가 난다.
예제 7. 부서 테이블에서 부서 번호 10번 행을 삭제
delete dept
where deptno = 10;
무결성 제약조건(C##SCOTT.EMP_DEPTNO_FK)이 위배되었습니다- 자식 레코드가 발견되었습니다.
자식 테이블에 부서 번호 10번이 존재하기 때문에, 부모 테이블인 dept 테이블의 10번 데이터를 함부로 삭제할 수 없다.