SQL

Constraint(제약조건) !!!! [개중요] !!!!

에어팟맥스 2022. 7. 14. 17:43

     >>>> 제약조건(Constraint)의 종류 <<<<
     
     --   제약조건의 이름은 오라클 전체에서 고유해야 한다.
     
     1. Primary Key(기본키, 대표식별자) 제약 [P]

        -- 하나의 테이블당 오로지 1개만 생성할 수 있다.
        -- 어떤 컬럼에 Primary Key(기본키) 제약을 주면 그 컬럼에는 자동적으로 NOT NULL 이 주어지면서 동시에

           그 컬럼에는 중복된 값은 들어올 수 없고 오로지 고유한 값만 들어오게 되어진다.
        -- 컬럼 1개를 가지고 생성된 Primary Key 를 Single Primary Key 라고 부르고,
        -- 컬럼 2개 이상을 가지고 생성된 Primary Key 를 Composite(복합) Primary Key 라고 부른다.
     
     2. Unique 제약 [U]              

        -- 하나의 테이블당 여러개를 생성할 수 있다.                                 
        -- 어떤 컬럼에 Unique 제약을 주면 그 컬럼에는 NULL 을 허용할 수 있으며, 그 컬럼에는 중복된 값은 들어올 수 없고

           오로지 고유한 값만 들어오게 되어진다.             
        -- Unique Key 중에 후보키, 후보식별자가 되려면 해당 컬럼은 NOT NULL 이어야 한다. 
  
     3. Foreign Key(외래키) 제약 [R]  

        -- 하나의 테이블당 여러개를 생성할 수 있다. 
        -- Foreign Key(외래키) 제약에 의해 참조(Reference)받는 컬럼은 반드시 NOT NULL 이어야 하고,

           중복된 값을 허락하지 않는 고유한 값만 가지는 컬럼이어야 한다. 
                                     
     4. Check 제약 [C]              

       -- 하나의 테이블당 여러개를 생성할 수 있다.
       -- insert(입력) 또는 update(수정) 시 어떤 컬럼에 입력되거나 수정되는 데이터값을 아무거나 허락하는 것이 아니라

          조건에 맞는 데이터값만 넣고자 할 경우에 사용되는 것이다.
  
     5. NOT NULL 제약 [C]            

      -- 하나의 테이블당 여러개를 생성할 수 있다.
      -- 특정 컬럼에 NOT NULL 제약을 주면 그 컬럼에는 반드시 데이터값을 주어야 한다는 말이다. 

 

 

 

 

 


   ----- >>>> Primary Key(기본키, 대표식별자) 제약 [P] 및 Unique 제약 [U] 에 대해서 알아보기 <<<< -----


 

"회원" 이라는 테이블을 생성한다.

   create table tbl_new_member
   (member_id   varchar2(20)             -- 아이디 Primary Key 이기 때문에 자동적으로 not null
  , passwd      varchar2(20)   not null  -- 비밀번호
  , name        Nvarchar2(10)  not null  -- 성명
  , email       varchar2(50)   not null  -- 이메일
  , mobile      varchar2(11)             -- 휴대폰
   , constraint PK_tbl_new_member_member_id Primary Key(member_id) -- Single(단독) Primary Key
   -- 참고: 오라클 11g 에서 객체명은 최대 글자수가 30글자 이다. 30글자를 넘으면 오류 발생
   -- 오라클 18c 는 괜찮음
   , constraint UQ_tbl_new_member_email unique(email)
   , constraint UQ_tbl_new_member_mobile unique(mobile)
   );
   -- Table TBL_NEW_MEMBER이(가) 생성되었습니다.

 


   desc tbl_new_member;
   /*
           이름        널?       유형            
        --------- -------- ------------- 
        MEMBER_ID NOT NULL VARCHAR2(20)  
        PASSWD    NOT NULL VARCHAR2(20)  
        NAME      NOT NULL NVARCHAR2(10) 
        EMAIL     NOT NULL VARCHAR2(50)  
        MOBILE             VARCHAR2(11)  
   */
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values(null, 'qwer1234$', '이순신', 'leess@naver.com', null);
   -- ORA-01400: NULL을 ("HR"."TBL_NEW_MEMBER"."MEMBER_ID") 안에 삽입할 수 없습니다
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('leess', 'qwer1234$', '이순신', 'leess@naver.com', null);
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('leess', 'qwer1234$', '이삼순', 'leess@naver.com', null);
   -- ORA-00001: 무결성 제약 조건(HR.PK_TBL_NEW_MEMBER_MEMBER_ID)에 위배됩니다
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('leesamsun', 'qwer1234$', '이삼순', 'leess@naver.com', null);
   -- ORA-00001: 무결성 제약 조건(HR.UQ_TBL_NEW_MEMBER_EMAIL)에 위배됩니다
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('leesamsun', 'qwer1234$', '이삼순', 'leess@daum.com', null);
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;
   
   select *
   from tbl_new_member;
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('eomjh', 'qwer1234$', '엄정화', null, '01023456789');
   -- ORA-01400: NULL을 ("HR"."TBL_NEW_MEMBER"."EMAIL") 안에 삽입할 수 없습니다
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('eomjh', 'qwer1234$', '엄정화', 'eomjh@gmail.com', '01023456789');
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;
   
   select *
   from tbl_new_member;
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('kangkc', 'qwer1234$', '강감찬', 'kangkc@gmail.com', '01023456789');
   -- ORA-00001: 무결성 제약 조건(HR.UQ_TBL_NEW_MEMBER_MOBILE)에 위배됩니다
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('kangkc', 'qwer1234$', '강감찬', 'kangkc@gmail.com', '01077778888');
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('junghwa', 'qwer1234$', '엄정화', 'junghwa@gmail.com', '01055559999');
   -- 일부러 동명이인을 입력함
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;
   
   
   select *
   from tbl_new_member;

 

 

 

 

 

 

 


------ ===== ***** Composite(복합) Primary Key 예제 ***** ===== ------


   create table tbl_new_jumun    -- '주문' 테이블
   ( member_id    varchar2(20) not null             -- 회원 아이디
   , product_id   varchar2(50) not null             -- 제품 아이디
   , jumun_date   date default sysdate not null     -- 주문일자
   , jumun_qty    number not null                   -- 주문량
   , constraint PK_tbl_new_jumun primary key( member_id, product_id, jumun_date ) -- Composite(복합) Primary Key
   );
   -- Table TBL_NEW_JUMUN이(가) 생성되었습니다.

[실행]

   insert into tbl_new_jumun(member_id, product_id, jumun_date, jumun_qty)
   values('leess', '새우깡', default, 10);
   
   insert into tbl_new_jumun(member_id, product_id, jumun_date, jumun_qty)
   values('leess', '감자깡', default, 10);
   
   insert into tbl_new_jumun(member_id, product_id, jumun_date, jumun_qty)
   values('leess', '새우깡', default, 20);   
   
   commit;
   
   select *
   from tbl_new_jumun;

 

 

 

 

 

 

 

 

 


 ----- >>>> Foreign Key(외래키) 제약 [R] 에 대해서 알아보기 <<<< ----- 


   create table tbl_new_board
   ( boardno         number                           -- 게시글 글번호
   , subject         Nvarchar2(100)        not null         -- 글제목
   , content         Nvarchar2(2000)       not null         -- 글제목  -- clob: 4GB 까지 저장 가능
   , registerday     date default sysdate  not null    -- 작성일자
   , fk_member_id    varchar2(20)          not null          -- 작성자 아이디
   
   , constraint PK_tbl_new_board_boardno primary key(boardno)
   , constraint FK_tbl_new_board_fk_member_id Foreign key(fk_member_id) references tbl_new_member(member_id) -- Foreign key(= 참조키, 레퍼런스키)
   -- ORA-02270: 이 열목록에 대해 일치하는 고유 또는 기본 키가 없습니다.
   -- 참조를 받는 테이블의 컬럼은 반드시 not null 이면서 고유해야 한다. => Primary Key
   -- cascade 옵션이 없는 Foreign key 이다.
   );
   -- Table TBL_NEW_BOARD이(가) 생성되었습니다.

 

   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'batman' );
   -- ORA-02291: 무결성 제약조건(HR.FK_TBL_NEW_BOARD_NAME)이 위배되었습니다- 부모 키가 없습니다
   
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'leess' );
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 2, '두번째 글', '좋은하루', default, 'eomjh' );
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 3, '세번째 글', '날씨 좋ㄷ ㅏ', default, 'leess' );
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;
   
   select *
   from tbl_new_board;
   
   /*
   ----------------------------------------------------------------
    글번호  글제목     작성자명    작성일자
   ----------------------------------------------------------------
    글번호      -->  tbl_new_board.boardno
    글제목      -->  tbl_new_board.subject
    작성자명    -->  tbl_new_member.registerday
    작성일자    -->  tbl_new_board.name
   */
   
   
   select B.boardno as 글번호  
        , B.subject as 글제목     
        , M.name as 작성자명    
        , to_char(B.registerday, 'yyyy-mm-dd hh24:mi:ss') as 작성일자 
   from tbl_new_board B join tbl_new_member M
   ON B.fk_member_id = M.member_id
   order by 1 desc;

 

 

 

 

 

 

 

 

 


------ ===== ***** !!!!! Foreign Key 생성시 on delete cascade 옵션을 주는 것 !!!!! ***** ===== ------


   create table tbl_new_comment                        -- 게시글테이블에 대한 댓글 테이블 생성
   ( commentno         number                not null   -- 댓글번호
   , comment_content   Nvarchar2(2000)       not null   -- 댓글내용
   , registerday       date default sysdate  not null   -- 댓글작성일자
   , fk_boardno        number                not null   -- 게시글의 원글번호
   , fk_member_id      varchar2(20)          not null   -- 댓글작성자아이디
   
   , constraint PK_tbl_new_comment_commentno primary key(commentno)
   , constraint FK_tbl_new_comment_fk_boardno foreign key(fk_boardno) references tbl_new_board(boardno)
-- , constraint FK_tbl_new_comment_fk_boardno foreign key(fk_boardno) references tbl_new_board(boardno) on delete cascade
   , constraint FK_tbl_new_comment_fk_member_id foreign key(fk_member_id) references tbl_new_member(member_id)
   );
   -- Table TBL_NEW_COMMENT이(가) 생성되었습니다.

[실행]

   select *
   from tbl_new_comment;
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(1, '댓글내용입니다.', default, 1, 'eomjh');
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(2, '댓글내용2 입니다.', default, 1, 'eomjh');
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(3, '이것은 댓글 입니다.', default, 5, 'leess');
   -- ORA-02291: 무결성 제약조건(HR.FK_TBL_NEW_COMMENT_FK_BOARDNO)이 위배되었습니다- 부모 키가 없습니다
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(3, '이것은 댓글 입니다.', default, 3, 'leess');
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;
   
   select *
   from tbl_new_comment;

 

   select *
   from tbl_new_board;
   -- 현재는 원게시글 1, 3번글에 대한 댓글이 있다.
   
   
   -- 게시글(tbl_new_board) 테이블에서 특정글 삭제하기 -- 
   delete tbl_new_board
   where boardno = 2;  -- 원게시글 2번글을 삭제한다.
   -- 1 행 이(가) 삭제되었습니다.
   
   delete tbl_new_board
   where boardno = 1;  -- 원게시글 1번글을 삭제한다.
   -- ORA-02292: 무결성 제약조건(HR.FK_TBL_NEW_COMMENT_FK_BOARDNO)이 위배되었습니다- 자식 레코드가 발견되었습니다
   
   rollback;
   
   delete from tbl_new_comment
   where fk_boardno = 1;
   -- 2개 행 이(가) 삭제되었습니다.
   
   delete tbl_new_board
   where boardno = 1; 
   
   rollback;

 

 

------ ===== Foreign Key 생성시 on delete cascade 옵션을 주기 ===== ------

   drop table tbl_new_comment purge;
   -- Table TBL_NEW_COMMENT이(가) 삭제되었습니다.
   
   create table tbl_new_comment                        -- 게시글테이블에 대한 댓글 테이블 생성
   ( commentno         number                not null   -- 댓글번호
   , comment_content   Nvarchar2(2000)       not null   -- 댓글내용
   , registerday       date default sysdate  not null   -- 댓글작성일자
   , fk_boardno        number                not null   -- 게시글의 원글번호
   , fk_member_id      varchar2(20)          not null   -- 댓글작성자아이디
   
   , constraint PK_tbl_new_comment_commentno primary key(commentno)
   , constraint FK_tbl_new_comment_fk_boardno foreign key(fk_boardno) references tbl_new_board(boardno) on delete cascade
   -- 부모 테이블인 tbl_new_board 테이블에 어떤 행을 삭제할 때 먼저 자식테이블인 tbl_new_comment 테이블에 자식 행(레코드)이 있다면 
   -- 먼저 자식테이블인 tbl_new_comment 테이블에서 자식 행을 삭제한다.
   , constraint FK_tbl_new_comment_fk_member_id foreign key(fk_member_id) references tbl_new_member(member_id)
   );
   -- Table TBL_NEW_COMMENT이(가) 생성되었습니다.

 

   select *
   from tbl_new_comment;
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(1, '댓글내용입니다.', default, 1, 'eomjh');
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(2, '댓글내용2 입니다.', default, 1, 'eomjh');
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(3, '이것은 댓글 입니다.', default, 5, 'leess');
   -- ORA-02291: 무결성 제약조건(HR.FK_TBL_NEW_COMMENT_FK_BOARDNO)이 위배되었습니다- 부모 키가 없습니다
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(3, '이것은 댓글 입니다.', default, 3, 'leess');
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;
   
   select *
   from tbl_new_comment;
   
   select *
   from tbl_new_board;

 

   delete from tbl_new_board
   where boardno = 1;
   -- 1 행 이(가) 삭제되었습니다.
   -- fk_boardno 컬럼에 1번글이 있던 것이 자동적으로 삭제됨
   
   rollback;

 

 

 


--------------------------------------------------------------------------------------------------
   ------ ===== ***** !!!!! Foreign Key 생성시 on delete set null 옵션을 주는 것 !!!!! ***** ===== ------
   --------------------------------------------------------------------------------------------------

   delete from tbl_new_member
   where member_id = 'leess';
   -- ORA-02292: 무결성 제약조건(HR.FK_TBL_NEW_BOARD_FK_MEMBER_ID)이 위배되었습니다- 자식 레코드가 발견되었습니다
   
   select *
   from tbl_new_board;
   
   desc tbl_new_board;
   
   alter table tbl_new_board 
   modify fk_member_id null;
   -- fk_member_id 가 not null 에서 null 로 바뀜
   
   update tbl_new_board set fk_member_id = null
   where fk_member_id = 'leess';
   -- 2개 행 이(가) 업데이트되었습니다.
   
   delete from tbl_new_member
   where member_id = 'leess';
   -- ORA-02292: 무결성 제약조건(HR.FK_TBL_NEW_COMMENT_FK_MEMBER_ID)이 위배되었습니다- 자식 레코드가 발견되었습니다
   
   select *
   from tbl_new_comment;
   
   update tbl_new_comment set fk_member_id = null
   where fk_member_id = 'leess';
   -- ORA-01407: NULL로 ("HR"."TBL_NEW_COMMENT"."FK_MEMBER_ID")을 업데이트할 수 없습니다
   
   desc tbl_new_comment;
   
   alter table tbl_new_comment
   modify fk_member_id null;
   -- Table TBL_NEW_COMMENT이(가) 변경되었습니다.
   
   update tbl_new_comment set fk_member_id = null
   where fk_member_id = 'leess';
   -- 1 행 이(가) 업데이트되었습니다.
   
   commit;
   
   delete from tbl_new_member
   where member_id = 'leess';
   -- 1 행 이(가) 삭제되었습니다.

   select *
   from tbl_new_member;
   
   select *
   from tbl_new_board;
   
   select *
   from tbl_new_comment;
   
   -- leess 회원이 탈퇴하면서 작성한 글과 댓글들의 fk_member_id 가 null 로 바뀜

 

-- Foreign Key 생성시 on delete set null 옵션을 주기 --

 

   drop table tbl_new_comment purge;
   
   drop table tbl_new_board purge;

   -- 테이블을 drop 할 때도 자식테이블이 있는 경우 부모테이블을 drop 할 수가 없다.
   -- 그러므로 부모테이블과 자식테이블 모두 삭제할 경우에는 먼저 자식테이블부터 drop 을 하고
   -- 그 뒤에 부모테이블을 drop 해야 한다.

 

 

 

   -- 테이블 생성시에는 부모테이블부터 만들고 그 다음에 자식테이블을 생성해야 한다.

   create table tbl_new_board
   ( boardno         number                           -- 게시글 글번호
   , subject         Nvarchar2(100)        not null         -- 글제목
   , content         Nvarchar2(2000)       not null         -- 글제목  -- clob: 4GB 까지 저장 가능
   , registerday     date default sysdate  not null    -- 작성일자
   , fk_member_id    varchar2(20)          not null          -- 작성자 아이디
   
   , constraint PK_tbl_new_board_boardno primary key(boardno)
   , constraint FK_tbl_new_board_fk_member_id Foreign key(fk_member_id) references tbl_new_member(member_id) on delete set null  -- Foreign key(= 참조키, 레퍼런스키)
   -- ORA-02270: 이 열목록에 대해 일치하는 고유 또는 기본 키가 없습니다.
   -- 참조를 받는 테이블의 컬럼은 반드시 not null 이면서 고유해야 한다. => Primary Key
   -- cascade 옵션이 없는 Foreign key 이다.
   );
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'leess' );
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 2, '두번째 글', '좋은하루', default, 'eomjh' );
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 3, '세번째 글', '날씨 좋ㄷ ㅏ', default, 'leess' );
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;
   
   select *
   from tbl_new_board;
   
   delete from tbl_new_member 
   where member_id = 'leess';
   ORA-01407: NULL로 ("HR"."TBL_NEW_BOARD"."FK_MEMBER_ID")을 업데이트할 수 없습니다

 

 

 

   create table tbl_new_board
   ( boardno         number                           -- 게시글 글번호
   , subject         Nvarchar2(100)        not null   -- 글제목
   , content         Nvarchar2(2000)       not null   -- 글제목  -- clob: 4GB 까지 저장 가능
   , registerday     date default sysdate  not null   -- 작성일자
   , fk_member_id    varchar2(20)                     -- 작성자 아이디
   
   , constraint PK_tbl_new_board_boardno primary key(boardno)
   , constraint FK_tbl_new_board_fk_member_id Foreign key(fk_member_id) references tbl_new_member(member_id) on delete set null  -- Foreign key(= 참조키, 레퍼런스키)
   -- 부모테이블인 tbl_new_member 테이블에서 특정 행을 삭제할 때 자식테이블인 tbl_new_board 테이블에 
   -- 삭제하려는 부모테이블 tbl_new_member 의 행을 참조하고 있는 행이 있을 때 fk_member_id 컬럼의 값을 먼저 null 로 update 하고나서 
   -- 부모테이블인 tbl_new_member 테이블에서 특정 행을 삭제한다.
   -- 그런데 이것을 하기 위한 전제조건은 fk_member_id 컬럼의 값은 null 을 허용해야 한다는 것이다.
   );

 

 

   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'leess' );
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 2, '두번째 글', '좋은하루', default, 'eomjh' );
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 3, '세번째 글', '날씨 좋ㄷ ㅏ', default, 'leess' );
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;
   
   select *
   from tbl_new_board;
   
   delete from tbl_new_member 
   where member_id = 'leess';
   -- 1 행 이(가) 삭제되었습니다.
   
   rollback;

 



------------------------------- ***** 최종 ***** -------------------------------

   drop table tbl_new_comment purge;
   
   drop table tbl_new_board purge;
   
   drop table tbl_new_member purge;

 

 

   create table tbl_new_member
   (member_id   varchar2(20)                     -- 아이디 Primary Key 이기 때문에 자동적으로 not null
  , passwd      varchar2(20)   not null          -- 비밀번호
  , name        Nvarchar2(10)  not null          -- 성명
  , email       varchar2(50)   not null          -- 이메일
  , mobile      varchar2(11)                     -- 휴대폰
  , status      number(1) default 1 not null     -- 회원의 탈퇴유무를 알려주는 용도 ( 1: 가입중, 0 : 탈퇴 )
  , point       number(4) default 100 not null   -- 포인트
  
  , constraint PK_tbl_new_member_member_id Primary Key(member_id) -- Single(단독) Primary Key
  , constraint UQ_tbl_new_member_email unique(email)
  , constraint UQ_tbl_new_member_mobile unique(mobile)
  , constraint CK_tbl_new_member_status check( status in(0,1) )
  , constraint CK_tbl_new_member_point check( point between 0 and 9000 )
   );
   -- Table TBL_NEW_MEMBER이(가) 생성되었습니다.

 

   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('leess', 'qwer1234$', '이순신', 'leess@naver.com', null);
   -- 1 행 이(가) 삽입되었습니다.
   -- status 와 point 는 디폴트로 삽입
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('eomjh', 'qwer1234$', '엄정화', 'eomjh@gmail.com', '01023456789');
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_member(member_id, passwd, name, email, mobile) 
   values('kangkc', 'qwer1234$', '강감찬', 'kangkc@gmail.com', '01077778888');
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;

 

   select *
   from tbl_new_member;
   
   update tbl_new_member set status = 5
   where member_id = 'leess';
   -- ORA-02290: 체크 제약조건(HR.CK_TBL_NEW_MEMBER_STATUS)이 위배되었습니다
   
   update tbl_new_member set status = 0
   where member_id = 'leess';
   -- 1 행 이(가) 업데이트되었습니다.
   
   update tbl_new_member set status = 1
   where member_id = 'leess';
   -- 1 행 이(가) 업데이트되었습니다.
   
   update tbl_new_member set point = 9500
   where member_id = 'leess';
   -- ORA-02290: 체크 제약조건(HR.CK_TBL_NEW_MEMBER_POINT)이 위배되었습니다
   
   update tbl_new_member set point = 300
   where member_id = 'leess';
   -- 1 행 이(가) 업데이트되었습니다.
   
   select *
   from tbl_new_member;
   
   commit;

   create table tbl_new_board
   ( boardno         number                           -- 게시글 글번호
   , subject         Nvarchar2(100)        not null   -- 글제목
   , content         Nvarchar2(2000)       not null   -- 글내용
   , registerday     date default sysdate  not null   -- 작성일자
   , fk_member_id    varchar2(20)          not null   -- 작성자 아이디
   
   , constraint PK_tbl_new_board_boardno primary key(boardno)
   , constraint FK_tbl_new_board_fk_member_id Foreign key(fk_member_id) references tbl_new_member(member_id) 
   );
   -- Table TBL_NEW_BOARD이(가) 생성되었습니다.

 

   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 1, '첫번째 글', '안녕하세요 ~ 1빠입니다.', default, 'leess' );
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 2, '두번째 글', '좋은하루', default, 'eomjh' );
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_board( boardno, subject, content, registerday, fk_member_id )
   values ( 3, '세번째 글', '날씨 좋ㄷ ㅏ', default, 'leess' );
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;
   
   select *
   from tbl_new_board;

 


   create table tbl_new_comment                         -- 게시글테이블에 대한 댓글 테이블 생성
   ( commentno         number                not null   -- 댓글번호
   , comment_content   Nvarchar2(2000)       not null   -- 댓글내용
   , registerday       date default sysdate  not null   -- 댓글작성일자
   , fk_boardno        number                not null   -- 게시글의 원글번호
   , fk_member_id      varchar2(20)          not null   -- 댓글작성자아이디
   
   , constraint PK_tbl_new_comment_commentno primary key(commentno)
   , constraint FK_tbl_new_comment_fk_boardno foreign key(fk_boardno) references tbl_new_board(boardno) on delete cascade
   , constraint FK_tbl_new_comment_fk_member_id foreign key(fk_member_id) references tbl_new_member(member_id)
   );
   -- Table TBL_NEW_COMMENT이(가) 생성되었습니다.

 

   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(1, '댓글내용입니다.', default, 1, 'eomjh');
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(2, '댓글내용2 입니다.', default, 1, 'eomjh');
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_new_comment(commentno, comment_content, registerday, fk_boardno, fk_member_id)
   values(3, '이것은 댓글 입니다.', default, 3, 'leess');
   -- 1 행 이(가) 삽입되었습니다.
   
   commit;

 

 

 

 

 

 



   /*
   ----------------------------------------------------------------
    글번호    글제목        작성자명    작성일자
   ----------------------------------------------------------------
     3     세번째 글 [1]   이순신      22/07/15 11:20:22
     2     두번째 글       엄정화      22/07/15 11:20:22
     1     첫번째 글 [2]   이순신      22/07/15 11:20:22
   */

 

   with
   cmt as
   ( select fk_boardno, count(*) as cmtcnt
     from tbl_new_comment
     group by fk_boardno
    ) 
   select BRD.boardno as 글번호
        , BRD.subject || case when CMT.cmtcnt is not null then ' [' || CMT.cmtcnt || ']' else null end as 글제목
        , MBR.name as 작성자명
        , to_char(BRD.registerday, 'yyyy-mm-dd hh24:mi:ss') as 작성일자
   from tbl_new_board BRD left join cmt
   on BRD.boardno = CMT.fk_boardno
   join tbl_new_member MBR
   on MBR.member_id = BRD.fk_member_id
   order by 1 desc;

 

   select *
   from tbl_new_comment   -- 댓글
   where fk_boardno = 1;

 

   delete from tbl_new_board  -- 원게시글
   where boardno = 1;

 

   delete from tbl_new_member  -- 원게시글
   where member_id = 'leess';   
   -- ORA-02292: 무결성 제약조건(HR.FK_TBL_NEW_BOARD_FK_MEMBER_ID)이 위배되었습니다- 자식 레코드가 발견되었습니다
   
   rollback;

 

   update tbl_new_member set status = 0
   where member_id = 'leess';   
   -- 1 행 이(가) 업데이트되었습니다.

 

   select *
   from tbl_new_member;
   
   select case (select count(*) 
                 from tbl_new_member
                 where status = 1 and member_id = 'leess' and passwd = 'qwer1234$' )
           when 1 then '로그인성공'
           else '로그인 실패'
           end 로그인결과
    from dual;

 

 

   select *
   from employees
   order by employee_id;
   
   update employees set manager_id = 9004
   where employee_id = 101;
   -- ORA-02291: 무결성 제약조건(HR.EMP_MANAGER_FK)이 위배되었습니다- 부모 키가 없습니다
   
   update employees set manager_id = 102
   where employee_id = 101;
   
   rollback;

 

 



   create table tbl_sawon
   ( sawon_no      number(4)         not null
   , saname       varchar2(40)   not null
   , manager_no   number(4)
   , constraint PK_tbl_sawon_sawon_no primary key(sawon_no)
   , constraint FK_tbl_sawon_manager_no foreign key(manager_no) references tbl_sawon(sawon_no)
   -- 참조받는 컬럼은 not null 이면서 primary key 여야 한다.
   );
   -- Table TBL_SAWON이(가) 생성되었습니다.
   
   insert into tbl_sawon(sawon_no, saname, manager_no) values(101, '나사장', null);
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_sawon(sawon_no, saname, manager_no) values(102, '김부장', 101);
   -- 1 행 이(가) 삽입되었습니다.
   
   insert into tbl_sawon(sawon_no, saname, manager_no) values(103, '이과장', 300);
   -- ORA-02291: 무결성 제약조건(HR.FK_TBL_SAWON_MANAGER_NO)이 위배되었습니다- 부모 키가 없습니다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'SQL' 카테고리의 다른 글

제약조건  (0) 2022.07.15
NOT NULL 제약  (0) 2022.07.15
****** PACKAGE(패키지) ******  (0) 2022.07.14
---- ===== **** CURSOR ( 중요 ) **** ===== -----  (0) 2022.07.14
배열처럼 사용되는 table 타입 변수  (0) 2022.07.14