본문 바로가기

JAVA/Oracle

오라클 - references 관련 설명 및 예제 및 개체무결성과 참조무결성

반응형



' references '

==> '참조키' ,참조하라는 뜻

레코드 자료형 references 참조할 테이블(참조할 레코드)

dno number references dept(dno)


create table emp(

eno varchar(20) primary key,

ename varchar(20),

dno number references dept(dno),

ehiredate date,

etel varchar(20),

esal number,

erank varchar(20),

eimg varchar(30),

eaddr varchar(50),

ejumin varchar(14));


dept 테이블과 emp 테이블을 서로 관계가 있도록 만들어 놓았습니다.

관계가 있다는 말은 두개의 테이블에 서로 공동으로 들어가는 컬럼이 있다.

어떤컬럼이 공동으로 들어가야 하냐면, 부모테이블(개체)의 주식별자(primary key) 만이 공동으로 들어가야 함


부모테이블(개체) 생각해보는 방법

어떤 것 테이블의 데이터가 먼저 들어가 있어야 하는지

예로 들면 부서테이블과 사원테이블 중에는 부서테이블;


** 자료넣기


** 존재하지 않는 부서에 근무하는 사원을 등록할 수 있는가?


** 소속된 사원이 있는데 부서가 삭제될 수 있는가?

insert into emp values(130, '홍길동', 600, sysdate, '010-7777-7777', 1500, '대표이사','h100.jpg',

'인천시 남동구','690208-1245789');


ORA-02291: 무결성 제약조건(SCOTT.SYS_C004054)이 위배되었습니다- 부모 키가

없습니다


==> 사원의 부서번호는 반드시 부서테이블이 나타난(존재하는) 부서번호 이여야만 하는데 그렇지 않다.

==> 지금 추가하려는 사원의 부서번호 600은 부서테이블에 없는 자료이다.


** 개체무결성

==> 테이블 생성시에 다른 레코드와 구별할 수 있는 식별자를 정해 주는데 그것을 주식별자(pk)라고 한다.


이 주식별자의 값을 유일해야 한다.

다른레코드하고 주식별자에 의해서 구별이 가능해야 한다.

 ==> 이러한 사상을 객체무결성이라 한다.


** 참조무결성

==> 관계에 있는 두 테이블(개체)에서 자식테이블의 참조키의 값은 반드시 부모개체의 주식별자에

나타난 값이어야 한다.




** 자료 추가 했다가 다시 지우기


insert into dept values(600, '개발3팀', '인천시 남동구 땡땡동', '032-222-2222'); // 추가

delete dept where dno=600; // 삭제


600 번 처럼 개발3팀에 소속된 사원이 없기때문에 삭제가 가능하고

100 번 처럼 개발1팀에 소속된 사원이 있다면 밑에처럼 에러가 뜬다.


ORA-02292: 무결성 제약조건(SCOTT.SYS_C004054)이 위배되었습니다- 자식 레코드가

발견되었습니다


== 자식테이블(개체)에서 참조되고 있는 부모테이블의 레코드는 삭제할 수 없다.

==> 꼭 지워야 하는 상황이라면 자식레코드의 데이터를 수정한 후 삭제한다.

 혹은 자식의 레코드를 삭제한 후 부모의 레코드를 삭제한다.


** 100번을 삭제했더니 삭제가 된 경우 원인

1) 서로 테이블이 관계설정이 안되어있을 수도..

2) 100번에 근무하는 사원이 없을 수도...

반응형