SQL

제약조건

에어팟맥스 2022. 7. 15. 17:47

 --------- **** 어떤 테이블에 제약조건을 추가하기 **** -----------

       제약조건 추가시 NOT NULL 제약을 제외한 나머지 4개는 아래와 같이한다.
       
       alter table 테이블명 add constraint 제약조건명 primary key(컬럼명);
       alter table 테이블명 add constraint 제약조건명 unique(컬럼명);
       alter table 테이블명 add constraint 제약조건명 check( ... );
       
       alter table 테이블명 add constraint 제약조건명 foreign key(컬럼명) references 부모테이블명(식별자컬럼명);
       alter table 테이블명 add constraint 제약조건명 foreign key(컬럼명) references 부모테이블명(식별자컬럼명) on delete casecade;
       alter table 테이블명 add constraint 제약조건명 foreign key(컬럼명) references 부모테이블명(식별자컬럼명) on delete set null;

 

 


       NOT NULL 제약을 추가할 때는 아래와 같이 한다.
       
       alter table 테이블명 modify 컬럼명 [constraint 제약조건명] not null;

 


   create table tbl_buseo
   (buseono      number(3)
  , buname       varchar2(40)
  );
   -- Table TBL_BUSEO이(가) 생성되었습니다.

 

 

-- Table TBL_BUSEO 에 생성된 제약조건 조회하기

   select A.constraint_name, A.constraint_type, A.search_condition, A.r_constraint_name,
          A.status, A.index_name, B.column_name, B.position
   from user_constraints A JOIN user_cons_columns B
   on A.constraint_name = B.constraint_name
   where A.table_name = 'TBL_BUSEO';

 

   alter table tbl_buseo 
   add constraint PK_tbl_buseo_buseono primary key(buseono);
   -- Table TBL_BUSEO이(가) 변경되었습니다.
   
   alter table tbl_buseo 
   modify buname constraint NN_tbl_buseo_buname not null;
   -- Table TBL_BUSEO이(가) 변경되었습니다.

 

 


   drop table tbl_jikwon purge;
   
   create table tbl_jikwon
   (jikwon_no    number(5)
  , jikname      varchar2(30)
  , email        varchar2(30)
  , jikkub       varchar2(20)
  , fk_buseono   number(3)
    );
   -- Table TBL_JIKWON이(가) 생성되었습니다.

 

   alter table tbl_jikwon add constraint PK_tbl_jikwon_jikwon_no primary key(jikwon_no);
   -- Table TBL_JIKWON이(가) 변경되었습니다.
   alter table tbl_jikwon add constraint UQ_tbl_jikwon_jikwon_email unique(email);
   -- Table TBL_JIKWON이(가) 변경되었습니다.
   alter table tbl_jikwon add constraint CK_tbl_jikwon_jikwon_jikkub check( jikkub in('사원','대리','과장','부장','사장') );
   -- Table TBL_JIKWON이(가) 변경되었습니다.
   alter table tbl_jikwon add constraint FK_tbl_jikwon_fk_buseono foreign key(fk_buseono) references tbl_buseo(buseono) on delete set null;

 

 

   select A.constraint_name, A.constraint_type, A.search_condition, A.r_constraint_name,
          A.status, A.index_name, B.column_name, B.position
   from user_constraints A JOIN user_cons_columns B
   on A.constraint_name = B.constraint_name
   where A.table_name = 'TBL_JIKWON';

 

 

   create table tbl_jikwon_2
   (jikwon_no    number(5)         primary key   -- 이렇게 해도 틀린 것은 아니지만 제약조건명이 SYS_C숫자 로 나오므로 유지관리가 힘들기 때문에 웬만하면 이렇게 쓰지 않는 것이 좋다.
  , jikname      varchar2(30)      not null
  , email        varchar2(30)      unique
  , jikkub       varchar2(20)      
  , fk_buseono   number(3)         
    );

 

   select A.constraint_name, A.constraint_type, A.search_condition, A.r_constraint_name,
          A.status, A.index_name, B.column_name, B.position
   from user_constraints A JOIN user_cons_columns B
   on A.constraint_name = B.constraint_name
   where A.table_name = 'TBL_JIKWON_2';

 

 

 


   -----------------------------------------------------------
   ---------------- **** 제약조건명 변경하기 **** ----------------
   -----------------------------------------------------------

 

        alter table 테이블명
        rename constraint 현재사용중인제약조건명 to 새로운제약조건명;

 

   alter table tbl_jikwon_2
   rename constraint SYS_C007788 to PK_TBL_JIKWON_2_JIKWON_NO;
   -- Table TBL_JIKWON_2이(가) 변경되었습니다.
   -- ' ' 는 사용하지 않는다.

 


---- *** 어떤 테이블에 제약조건을 삭제하기 *** ----

 

      alter table 테이블명 drop constraint 제약조건명;
        
      그런데 NOT NULL 제약은 위의 것처럼 해도 되고, 또는 아래처럼 해도 된다.
      alter table 테이블명 modify 컬럼명 null;
        
      어떤 테이블에 primary key 제약조건을 삭제할 경우에는 위의 것처럼 해도 되고, 또는 아래처럼 해도 된다.
      alter table 테이블명 drop primary key;

 

  select A.constraint_name, A.constraint_type, A.search_condition, A.r_constraint_name,
          A.status, A.index_name, B.column_name, B.position
   from user_constraints A JOIN user_cons_columns B
   on A.constraint_name = B.constraint_name
   where A.table_name = 'TBL_JIKWON';
  alter table TBL_JIKWON drop constraint CK_TBL_JIKWON_JIKWON_JIKKUB;
  -- Table TBL_JIKWON이(가) 변경되었습니다.

 


   ----------------------------------------------------------------
   ---------------- **** 제약조건의 내용 변경하기 **** ----------------
   ----------------------------------------------------------------
   

 

   -- TBL_JIKWON 테이블에 있는 jikkub 컬럼에 check 제약의 내용을 변경하고자 한다.
   -- 직급의 종류는 '사원','대리','과장','부장','사장' 에서
   -- '사원','대리','과장', '차장' ,'부장','이사', '사장' 으로 변경하고자 한다.
   
   -- !!!! 제약조건의 내용을 변경하는 명령어는 없다. !!!! --
   -- 그러므로 해당 제약조건을 삭제하고 다시 새롭게 생성하면 된다.

 

   alter table TBL_JIKWON add constraint CK_TBL_JIKWON_JIKWON_JIKKUB check( jikkub in ( '사원','대리','과장', '차장' ,'부장','이사', '사장' ) );
   -- Table TBL_JIKWON이(가) 변경되었습니다.

 

 

 

 


 

---- *** 어떤 테이블에 존재하는 제약조건을 비활성화 시키기 *** ----

 

alter table 테이블명 disable constraint 제약조건명;

 

   alter table TBL_JIKWON disable constraint CK_TBL_JIKWON_JIKWON_JIKKUB;
   -- Table TBL_JIKWON이(가) 변경되었습니다.
   -- check( jikkub in ( '사원','대리','과장', '차장' ,'부장','이사', '사장' ) ) 의 구애를 받지 않음

 


 

---- *** 어떤 테이블에 존재하는 제약조건을 활성화 시키기 *** ----

 

 

 /*
        alter table 테이블명 enable constraint 제약조건명;
   */

   alter table TBL_JIKWON enable constraint CK_TBL_JIKWON_JIKWON_JIKKUB;
   -- Table TBL_JIKWON이(가) 변경되었습니다.
   -- check( jikkub in ( '사원','대리','과장', '차장' ,'부장','이사', '사장' ) ) 활성화