KH/Oracle

# 18 on delete cascade & on delete set null

오늘의 진 2022. 9. 2. 14:56

 

create table emp_test2(
id VARCHAR(20),
name VARCHAR2(20) not null,
kor number(7,2) DEFAULT 0.0,
CONSTRAINT id_pkkk_test PRIMARY key(id));

create table emp_kor2(
id VARCHAR(20),
total number(7,2), 
avg number(8,3),
constraint id_ffkk_test foreign key(id) REFERENCES emp_test2(id));

 

emp_test2 emp_kor2
delete from emp_test2 where id='king_4';

프라이머리키를 삭제하려고 하면 이를 참조하는(외래키로 사용하는) 자식 레코드가 있기때문에 삭제가 불가능 하다. 

 

 

  삭제하는방법    -  외래키쪽에서 먼저 삭제를 해주고 프라이머리 키에서 삭제를 해준다. 

delete from emp_kor2 where id ='king_4';
delete from emp_test2 where id='king_4';

 

 

 

on delete cascade 사용 

 

(예)

create table emp_test2(
id VARCHAR(20),
name VARCHAR2(20) not null,
kor number(7,2) DEFAULT 0.0,
CONSTRAINT id_pkkk_test PRIMARY key(id));

create table emp_kor2(
id VARCHAR(20),
total number(7,2), 
avg number(8,3),
constraint id_ffkk_test foreign key(id) REFERENCES emp_test2(id) on delete cascade);
emp_test2 emp_kor2

삭제 실행 

delete from emp_test2 where id='king_3';
emp_test2 emp_kor2

>>  on delete cascade 를 사용해 주었음으로

     부모키를 삭제해 주면 자식키를 자동으로 함께 삭제한다. (연쇄적으로 삭제된다.)

 

 

on delete set null

create table emp_test2(
id VARCHAR(20),
name VARCHAR2(20) not null,
kor number(7,2) DEFAULT 0.0,
CONSTRAINT id_pkkk_test PRIMARY key(id));


create table emp_eng2(
id VARCHAR(20),
total number(7,2), 
avg number(8,3),
constraint id_ffkk_test2 foreign key(id) REFERENCES emp_test2(id) on delete set null);
EMP_TEST2 EMP_ENG2

프라이머리키 삭제 

EMP_TEST2 EMP_ENG2

>>  프라이머리 키를 삭제할 경우 해당 프라이머리 키를 사용하는 외래키 쪽에서는 

      해당 행 전체가 삭제 되는 것이 아니라 키값 자리만 null로 변한다. 

 

 

 

(예)

테이블 & 시퀀스 만들기 

create table emp_total(
id VARCHAR(20),
name VARCHAR2(30) not null,
idnum number ,
brith date DEFAULT sysdate,
total number(7,2) DEFAULT 0.0,
avg number(5,2) DEFAULT 0.0,
CONSTRAINT id_emp PRIMARY key(id));

create table emp_kor_1(
id VARCHAR(20),
ename VARCHAR2(30) not null,
kor number(3) default 0, 
eng number(3)default 0,
math number(3)default 0,
constraint id_kor foreign key(id) REFERENCES emp_total(id) on delete cascade);

create table emp_eng_1(
id VARCHAR(20),
ename VARCHAR2(30) not null,
kor number(3) default 0, 
eng number(3)default 0,
math number(3)default 0,
constraint id_eng foreign key(id) REFERENCES emp_total(id) on delete set null);

create sequence  seq_total_seq
start with 1
increment by 1
maxvalue 99
minvalue 1
nocycle
nocache;

 

테이블에 내용삽입

insert into  emp_total  values('ko_5','lee',seq_total_seq.nextval,sysdate,5.5,1.3);

insert into emp_kor_1  values('ko_5','봉미선',50,22,10);

insert into emp_eng_1  values('ko_1','직선',666,9.12,3.2);

[테이블 확인]

EMP_TOTAL EMP_KOR_1 EMP_ENG_1

PRIMARY KEY  삭제 

delete from emp_total where id='ko_3';

[결과 확인 ]

EMP_TOTAL EMP_KOR_1 EMO_ENG_1
PRIMARY KEY on delet cascade on delete set null

 

primary key 에서 값이들어있는 행을 삭제하였다. 

on delet cascade 인 kor_1의 경우는 같은 키를 가진 행 전체가 삭제되었다. 

on delete set null 인 eng_1은 같은 키를 가진 행에서 키의 값만 null로 바뀌었다. 

 

 

 

 

 

 

 

 

 

 

 

 

'KH > Oracle' 카테고리의 다른 글

[Oracle] ROWNUMBER, ROW_NUMBER() OVER / 조회 순번 매기는 방법  (0) 2022.12.06
# 19 USER 계정 생성  (0) 2022.09.05
# 17 SEQUENCE (시퀀스)  (0) 2022.09.02
# 16 Transaction (트렌젝션)  (0) 2022.09.01
# 15 DML- insert, update,delect  (0) 2022.08.31