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;
'DataBase' 카테고리의 다른 글
[DataBase] 누구인가? 누가 나의 데이터베이스를 가져갔는가 (0) | 2023.07.20 |
---|---|
[DB설계] 하나의 게시글에 여러 개의 태그를 등록하고 싶은데 왜 tag테이블이 두 개가 필요한가 (0) | 2023.07.05 |
[Oracle] PL/SQL 스토어드 프로시저(Stored Procedure) 간단 정리 + 내가 자주내는 오류 녀석들 (0) | 2023.04.03 |
[Oracle] insert에 대하여 알아보자 (0) | 2023.03.28 |
[Oracle] 급여에 따라 급여 인상율 다르게 적용하기 (decode, case, sign) (0) | 2023.03.23 |