본문 바로가기
[DBMS]/- Oracle

[Oracle]Foregin Key (외래키)

by Hapco 2022. 5. 30.
728x90
반응형

외래키를 설정하지 않으면 생기는 문제점

--> 존재하지 않는 데이터의 추가가 가능하다

ex) 장바구니테이블에 외래키를 등록하지 않으면 존재하지 않는 상품도 등록이 가능하다.

-->해결책 : 외래키를 지정하여 대상 테이블에 존재하는지 확인후 데이터를 추가한다.

ex) 3개의 테이블이 있다고 가정하자

create table customer( customer_id varchar2(20) primary key, customer_pw varchar2(16) not null, customer_nick varchar2(30) not null unique, customer_point number ); create table item( item_no number primary key, item_name varchar2(60) not null, item_price number ); create table basket( basket_code number primary key, customer_id varchar2(20) not null, item_no number not null, item_quantity number, add_time date );

-- 마지막 의 basket 테이블의 경우는 외래키를 지정하지 않았기 떄문에 없는데이터도 추가가 가능하다.

외래키의 설정 방법

생성방법 -- 컬럼명 우측에 references 테이블명 (항목명) [ 옵션]

Create table basket(

bakset_code number primary key,

customer_id references customer(customer_id),

item_quantiy number,

add_time date

);

외래키를 지정하게되면

 

create sequence basket_seq; insert into basket values(basket_seq.nextval,'aaa',1,1,sysdate); insert into basket values(basket_seq.nextval,'aaa',2,1,sysdate); insert into basket values(basket_seq.nextval,'bbb',1,1,sysdate); insert into basket values(basket_seq.nextval,'ddd',5,2,sysdate);--존재하지 않는 회원과 상품 / 외래키를 적용하므로 추가안됨

외래키를 지정하고 삭제하려면 해당 내용을 전부 삭제후 삭제해야하는 불편함이 생긴다

ex) SNS를 탈퇴하려고 하는데 팔로우를 다 끊어야 하는 상황?

이러한 불편함을 해결하기 위해서 사용해야하는 명령어가잇다

ex) 내가 sns 를 탈퇴하면 follow가 전부 삭제 되어야한다 --> on delete cascade

on delete cascde : 부모키를 삭제하면 연결된 자식 항목은 자동 삭제

내가 sns 를 탈퇴한다하면 내가 작성한 댓글은 유지되어야 한다 --> on delete set null

on delete set null : 부모키를 삭제하면 연결된 자식 항목이 null로 설정 된다

ex) SMS follow system 구현

-사용자의 테이블 - create table client( client_id varchar2(20) primary key, client_pw varchar2(16) not null, client_nick varchar2(30) not null unique ); insert into client values('테스트1','테스트1','테스트닉네임1'); insert into client values('테스트2','테스트2','테스트닉네임2'); insert into client values('테스트3','테스트3','테스트닉네임3'); ​ -팔로우 라는 기능의 테이블 - create table follow( who references client(client_id) on delete cascade not null, target references client(client_id) on delete cascade not null, primary key(who,target) // 2개의 정보가 필수로 필요하다 ); insert into follow values ('테스트1','테스트3'); insert into follow values ('테스트3','테스트1'); insert into follow values ('테스트2','테스트1'); insert into follow values ('테스트2','테스트3')

'[DBMS] > - Oracle' 카테고리의 다른 글

[Oracle] JOIN ( INNER JOIN , OUTER JOIN)  (0) 2022.05.30
[Oracle]DML 수정 (update) , 삭제 (delete)  (0) 2022.05.30
[Oracle]집합연산  (0) 2022.05.30
[Oracle]기본키 Primary key  (0) 2022.05.30
[Oracle]그룹쿼리 Gruop by  (0) 2022.05.30

댓글