카테고리 없음

오라클 - 관계형 데이터베이스

장꾸꾸 2020. 10. 21. 16:51

 

 references  table(column)                                                
             : 해당 컬럼이 참조하고 있는 (부모)테이블의 특정 (테이블) 
               컬럼값들과 일치하거나 또는 NULL이 되도록 보장/ 컬럼 레벨X, 부모 레벨에서만 가능



       on delete restricted:삭제대상 데이터를 참조하는 데이터가 존재하면 삭제할수 없음(기본값)
       ex_ 자식레코드가 있는 경우 부모레코드 삭제시 에러메세지를 띄움
       
      	on update cascade:대상 데이터를 수정하면,해당 데이터를 참조하는 데이터도 수정
        ex_ 만약 부모 레코드인 dept의 deptno을 70으로 바꾸면 자식레코드의 deptno도 70으로 값이 바뀌게 됨

 

자식/ 부모 관계형 DB 만들기

 

부모테이블 생성

================================================================================================
--ex24) 테이블생성후 행추가
--테이블명 : dept
--deptno    number         ==> 기본키, 제약조건명(DNO)
--dname     varcahr2(30)   ==> 널 허용안됨, 제약조건명(DNAME)

create table dept(
deptno number constraint DNC primary key,
dname varchar2(30) constraint DNAME not null);

select * from tab;

insert into dept(deptno,dname) values(10,'개발부');
insert into dept(deptno,dname) values(20,'영업부');
insert into dept(deptno,dname) values(30,'관리부');
insert into dept(dname) values(40,'경리부');      --오류(컬럼갯수가 안맞음)
insert into dept values(40,'경리부'); 
commit;

 

자식테이블 생성

--테이블명 : emp
--empno   number       ==> 기본키,제약조건명(ENO)
--ename   varchar2(30) ==> 널허용안됨, 제약조건명(ENAME)
--deptno  number       ==> 외래키, 제약조건명(FKNO),
--                                     대상데이터를 삭제하고 참조하는데이터는 NULL로 바꿈

create table emp(
empno number constraint ENO primary key,
ename varchar2(30) constraint ENAME not null,
deptno number,
constraint FKNO foreign key(deptno) references dept on delete set null);

constraint FKNO foreign key(deptno) references dept on delete set null);

 

insert into dept(dname) values(40,'경리부');      --오류(컬럼갯수가 안맞음)

-> 명령의 526 행에서 시작하는 중 오류 발생 -
insert into dept(dname) values(40,'경리부')
오류 발생 명령행: 526 열: 13
오류 보고 -
SQL 오류: ORA-00913: too many values
00913. 00000 -  "too many values"
*Cause:    
*Action:

 

commit 후 확인하면 다음과 같다.

dept table

 

자식 table에 넣을 데이터들

insert into emp(empno,ename,deptno) values(100,'강호동',10);
insert into emp(empno,ename,deptno) values(101,'아이유',20);
insert into emp(empno,ename,deptno) values(102,'유재석',50); 
           -- 50번부서 없음(무결성제약조건위배)-부모키가 없습니다
insert into emp(empno,ename,deptno) values(103,'이효리',40);
insert into emp(empno,ename) values(105,'장동건');
insert into emp(ename,deptno) values('고소영',10); -- primary key는 NULL허용 안함
commit;

 

emp table

 

--ex25) 삭제
--dept테이블에서 20번 부서를 삭제하시오 

delete from dept where deptno = 20;

--삭제된 행을 되돌리시오

rollback;

 

dept 테이블에서 20번 부서를 삭제하면 아이유의 deptno 값이 null로 바뀐다

--dept테이블의  deptno=20과  emp테이블의 deptno=20이 releation 이 형성된경우 
--  ==> 삭제안됨(자식레코드가 발견되었습니다)
--on delete cascade를 설정하면 부모테이블과 자식테이블의 레코드가 함께 삭제됨
--on delete set null를 설정하면 부모테이블은 삭제되고 자식테이블은 null로 바뀜

 

--ex27) 수정(update)
--장동건의 부서를 30으로 수정하시오

update emp set deptno=30 where ename='장동건';
select * from emp;
commit;