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 |