ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210902_join+부모,자식테이블(예제)
    Oracle 2021. 9. 2. 11:42

    (예제1)

    --cart1에 상품추가
    insert into cart1 values(seq_shop.nextval,1,2,sysdate);  --1번 나이키 추가
    insert into cart1 values(seq_shop.nextval,5,1,sysdate);  --5번 추가
    insert into cart1 values(seq_shop.nextval,2,3,sysdate); 
    insert into cart1 values(seq_shop.nextval,4,2,sysdate); 
    commit;

    --shop에 없는 상품 추가
    --오류 보고 -
    --ORA-02291: 무결성 제약조건(ADMIN.CART_FK_NUM)이 위배되었습니다- 부모 키가 없습니다
    --없는 번호
    insert into cart1 values(seq_shop.nextval,7,2,sysdate);

    --cart2에 상품추가
    insert into cart2 values(seq_shop.nextval,3,2,sysdate);
    insert into cart2 values(seq_shop.nextval,4,1,sysdate);

    --cart1에 1번,5번 담김..1번 삭제
    --오류 보고 -
    --ORA-02292: 무결성 제약조건(ADMIN.CART_FK_NUM)이 위배되었습니다- 자식 레코드가 발견되었습니다
    --on delete cascade를 안 해줬기에
    delete from shop where num=1;

    delete from shop where num=3; --3번은 cart에 없으므로 삭제됨


    --cart2에 담긴 3,4번 삭제해보기
    --on delete cascade 설정해놔서 cart2랑 shop 둘 다 삭제됨
    delete from shop where num=3;

    rollback;  --3번 삭제 취소

    commit;

    --join위해서 cart2에 insert 추가
    insert into cart2 values(seq_shop.nextval,1,2,sysdate);
    insert into cart2 values(seq_shop.nextval,3,1,sysdate);
    insert into cart2 values(seq_shop.nextval,2,4,sysdate);
    commit;

    --테이블 출력
    select * from shop;
    select * from cart1;
    select * from cart2;

    --cart의 상품을 shop테이블과 join
    --방법1..풀네임으로 쓰기
    select cart1.idx, shop.num, shop.sangpum, shop.color, cart1.cnt, cart1.guipday 
    from shop, cart1 where shop.num=cart1.num;
    --방법2
    select c.idx, s.num, s.sangpum, s.color, c.cnt, c.guipday from shop s, cart1 c
    where s.num=c.num;
    --방법3..join테이블에 중복되지 않는 컬럼명은 테이블명 생략 가능
    select idx, c.num, sangpum, color, cnt, guipday from shop s, cart1 c
    where s.num=c.num;



    ~~~~~~~~~~~~~~~~~~~~~~~

     

    (예제2)
    --foreign key 사용해서 board, answer join 테이블 만들기

    create table board(bno number(3) constraint board_pk_bno primary key,
    writer varchar2(30), subject varchar2(30), writeday date);

    --board에 insert
    insert into board values(seq1.nextval, '요다','오늘 뭐하세요?',sysdate);
    insert into board values(seq1.nextval, '림짱','점심 뭐 먹을까',sysdate);
    insert into board values(seq1.nextval, '루크','운동하러 가야 되는데',sysdate);
    insert into board values(seq1.nextval, '볼트','나 완전 빨라',sysdate);
    insert into board values(seq1.nextval, '오월이','넷플에서 영화보자',sysdate);
    commit;

    --answer라는 테이블 생성, bno를 외부키로 설정할 예정
    --원글 삭제시 댓글 자동삭제되도록 만들기
    create table answer(num number(5) constraint answer_pk_num primary key,
    bno number(3) constraint answer_fk_bno references board(bno) on delete cascade,
    nickname varchar2(20), content varchar2(50));

    select * from board;

    --board에 댓글 추가해보기
    --원하는 bno에 댓글 넣으려면 bno 번호 쓰기
    insert into answer values(seq1.nextval, 15, '곰돌','공부여..');
    insert into answer values(seq1.nextval, 16, '여엉','로제떡볶이에 볶읔밥!!');
    insert into answer values(seq1.nextval, 19, '현자타임','운동 정말 싫어');
    insert into answer values(seq1.nextval, 20, '루이비','고양이계의 우사인볼트');
    insert into answer values(seq1.nextval, 23, '순탄이','뭐 볼까?');
    commit;

    --join으로 출력
    --글번호,작성자,작성자글,댓글단사람,댓글내용,원글작성날짜
    select b.bno 글번호, writer 작성자, subject 제목, nickname 댓글단사람, content 댓글, 
    writeday 원글작성일 from board b, answer a where b.bno=a.bno;

    --원글 삭제하면 댓글 삭제되게 해보기
    delete from board where bno=15;

    --확인
    select * from answer;

    rollback;

    --board 테이블 삭제..불가능
    --오류 보고 ORA-02449: 외래 키에 의해 참조되는 고유/기본 키가 테이블에 있습니다
    drop table board;

    --자식테이블 answer 삭제
    drop table answer;

    --자식 테이블 삭제 후 부모테이블 board 삭제 가능
    drop table board;

    'Oracle' 카테고리의 다른 글

    210902_  (0) 2021.09.02
    210901_join  (0) 2021.09.01
    210901_오류  (0) 2021.09.01
    210901_숫자함수  (0) 2021.09.01
    210901_rollup,cube  (0) 2021.09.01

    댓글

Designed by Tistory.