alter table dept
add constraint dept_deptno_pk primary key(deptno);
부모-자식(foreign key) 관계 생성
alter table emp
add constraint emp_deptno_fk foreign key(deptno)
references dept(deptno);
-- 에러발생
-- ORA-02291: 무결성 제약조건(C##SCOTT.EMP_DEPTNO_FK)이 위배되었습니다- 부모 키가 없습니다
update emp
set deptno=60
where ename='KING';
delete from dept
where deptno = 20;
-- 에러발생
-- ORA-02292: 무결성 제약조건(C##SCOTT.EMP_DEPTNO_FK)이 위배되었습니다- 자식 레코드가 발견되었습니다
-- 에러발생
-- ORA-02273: 고유/기본 키가 외부 키에 의해 참조되었습니다
alter table dept
drop constraint dept_deptno_pk;
-- cascade 사용해서 삭제
alter table dept
drop constraint dept_deptno_pk cascade;
💡 cascade 옵션을 쓰면 부모키를 삭제할 때 자식키도 같이 삭제됨
alter table 테이블명
drop constraint 제약조건명 cascade;
alter table telecom_table
add constraint tt_telecom_pk primary key(telecom);
alter table emp21
add constraint emp21_telecom_fk foreign key(telecom)
references telecom_table(telecom);
-- 에러발생
-- ORA-02291: 무결성 제약조건(C##SCOTT.EMP21_TELECOM_FK)이 위배되었습니다- 부모 키가 없습니다
update emp21
set telecom='toss'
where ename='000';
(SQLD, SQLP, OCP)
dept와 emp 테이블에 부모 자식관계를 맺을 때
dept 테이블의 deptno를 지우면
emp 테이블의 deptno도 같이 지워지는 옵션
dept 테이블의 deptno 를 지우면
emp 테이블의 deptno는 null로 변경이 되는 옵션
#1. demo 스크립트를 수행합니다.
cmd 창에서 @demo
#2. dept 테이블의 deptno 에 primary key 제약을 겁니다.
alter table dept
add constraint dept_deptno_pk primary key(deptno);
#3. emp 테이블의 deptno 에 foreign key 제약을 걸면서
dept 테이블의 deptno를 참조하겠다. (on delete cascade 옵션을 주고)
alter table emp
add constraint emp_deptno_fk foreign key(deptno)
references dept(deptno) on delete cascade;
#4. dept 테이블의 부서번호 10번을 지우시오
delete from dept
where deptno = 10;
#5. emp 테이블의 부서번호 10번도 같이 지워지는지 확인합니다.
select *
from emp
where deptno = 10;
#6. 부모키 제약을 삭제하면서 자식키 제약도 같이 삭제되게하시오
alter table dept
drop constraint dept_deptno_pk cascade;
alter table dept
add constraint dept_deptno_pk primary key(deptno);
alter table emp
add constraint emp_deptno_fk foreign key(deptno)
references dept(deptno) on delete set null;
delete from dept
where deptno = 20;
select * from emp;