본문 바로가기

DataBase

[Oracle] Foreign key 제약사항

Foreign key

먼저 테이블을 생성해봅시다

create table test1 (
   no      number,
   name    varchar2(10),
   deptno  number
);

create table test2 (
   no      number,
   name    varchar2(10),
   deptno  number
);

foreign key(FK) 설정하기 (FK는 참조테이블의 컬럼이 Primary key 또는 Unique key인 컬럼만 정의 가능!)

alter table test2 add constraint test2_deptno_uk unique(deptno);

--> test2 테이블의 deptno 컬럼을 제약명이 test2_deptno_uk인 유니크 키 값으로 설정 

(PK나 UK를 설정하지 않으면 no matching unique or primary key for this column-list 에러 발생)

 

alter table test1 add constraint test1_deptno_fk foreign key(deptno) references test2(deptno);

--> test1 테이블의 deptno 컬럼을 test2 테이블의 deptno 컬럼 참조하여 제약명이 test1_deptno_fk인 외래키로 설정

   (현재 test2가 부모테이블, test1이 자식테이블로 설정)

 

select * from user_constraints
   where table_name like 'TEST%';

--> TEST로 시작하는 테이블명의 제약조건들을 보여줘라~!

 

 

* 부모테이블 test2에 먼저 내용이 있어야 자식테이블 test1에 내용을 넣을 수 있다.

  (자식테이블 test1에 내용을 먼저 넣는 경우에 integrity constraint (SCOTT.C_TEST1_DEPT_FK) violated - parent key not found 에러 발생)

insert into test2 values(1, '개발팀', 10);
insert into test1 values(1, '딩딩쓰', 10);

 

* 부모테이블 test2의 내용을 삭제하려면 자식테이블 test1의 내용을 먼저 삭제해야한다.

(부서번호가 10인 부모테이블 test2의 내용을 삭제하는 경우에 integrity constraint (SCOTT.C_TEST1_DEPT_FK) violated - child record found 에러 발생)

 

delete from test1 where deptno = 10;
delete from test2 where deptno = 10;

 

* 부모테이블의 내용을 삭제할 수 있도록 정의하는 옵션

 

1) 부모와 자식을 동시에 삭제하는 옵션 - on delete cascade

alter table test2 add constraint test2_deptno_uk unique(deptno);

alter table test1 add constraint test1_deptno_fk foreign key(deptno) references test2(deptno) 
   on delete cascade;

 

2) 부모는 삭제하고 자식의 FK컬럼에 null로 업데이트하는 옵션

alter table test2 add constraint test2_deptno_uk unique(deptno);

alter table test1 add constraint test1_deptno_fk foreign key(deptno) references test2(deptno) 
   on delete set null;