'국비지원'의 시작

오라클 비긴즈 08 ( Constraints ( 제약 ) )

개발할 결심 2023. 2. 15. 18:54

  >>>> 오라클의 제약조건(Constraint)의 종류 <<<<
   
   -- 제약조건(Constraint)의 이름은 오라클 전체에서 고유해야 한다. 
      즉, 제약조건(Constraint)의 이름은 중복을 허락치 않는

오라클에서  각 테이블마다 제약조건을 확인해보고 싶으면  다음과 같이 입력하면 된다.

select * from constraints 
-- 모든 테이블에 걸려있는 제약을 살펴볼 수 있다. 
select * from constraints where table_name = ' EMPLOYEES ' 
-- EMPLOYEES 테이블에 걸려있는 제약  
-- 이 경우에, table_name 뒤에 오는 값에 대문자를 입력하지 않으면 나타나지 않을 수 있다.

1. Primary Key(기본키, 대표식별자) 제약 [P] 

      -- 하나의 테이블당 오로지 1개만 생성할 수 있다.
      -- 어떤 컬럼에 Primary Key(기본키) 제약을 주면 그 컬럼에는 자동적으로 NOT NULL 이 주어지면서
         동시에 그 컬럼에는 중복된 값은 들어올 수 없고 오로지 고유한 값만 들어오게 되어진다.
      -- 컬럼 1개를 가지고 생성된 Primary Key 를 Single Primary Key 라고 부르고,
         컬럼 2개 이상을 가지고 생성된 Primary Key 를 Composite(복합) Primary Key 라고 부른다.

      -- 그렇다면, Primary Key 에 대한 간단한 사용방법에 대해 알아보도록 하겠습니다.

create table tbl_newgogek
( gogekId       varchar2(30)  
, gogekName     Nvarchar2(20) not null
, gogekPhone    varchar2(20)
, constraint    PK_tbl_newgogek_gogekId Primary key(gogekId) -- ROW(행) Level 제약조건
-- gogekId 컬럼에 primary key 제약조건을 주는데 그 제약조건의 이름은 PK_tbl_newgogek_gogekId 이다.
); -- 결과 : Table TBL_NEWGOGEK이(가) 생성되었습니다.

- 위처럼 , Primary Key 제약을 할 수 있는데, 이를 표준화해서 보면 다음과 같다.                                                -- , constraint             constraint 명  Primary key (컬럼명)                                                                                           Primary key 를 설정하고 조심해야할 부분은  Primary key 로 지정한 컬럼에 값을 집어넣는 경우에  이미 존재하고 있는 값을 똑같이 넣게 된다면 오류가 발생할 것이다.  이점에 대해서 유의하길 바란다.


2. Unique 제약 [U]

      -- 하나의 테이블당 여러개를 생성할 수 있다. 
      -- 어떤 컬럼에 Unique 제약을 주면 그 컬럼에는 NULL 을 허용할 수 있으며,
         그 컬럼에는 중복된 값은 들어올 수 없고 오로지 고유한 값만 들어오게 되어진다.
      -- 여러개의 Unique Key 중에 후보키(후보식별자)가 되려면 해당 컬럼은 NOT NULL 이어야 한다.  

      -- 그렇다면, Unique Key 를 만드는 방법에 대해서 설명드리도록 하겠습니다. 

 create table tbl_gogek
( gogekId       varchar2(30) 
, gogekName     Nvarchar2(20) not null
, gogekPhone    varchar2(20) 
, gogekEmail    varchar2(30) not null
, constraint    UQ_tbl_gogek_gogekPhone unique(gogekPhone) 
-- gogekPhone 컬럼에 Unique 제약을 거는 거
, constraint    UQ_tbk_gogek_gogekEmail unique(gogekEmail)
-- gogekEmail 컬럼에 Unique 제약을 준 것 
); -- 결과 : Table TBL_GOGEK이(가) 생성되었습니다.

- 위처럼 , Unique Key 제약을 할 수 있는데, 이를 표준화해서 보면 다음과 같다.                                                -- , constraint             constraint 명  Unique (컬럼명)                                                                                           Unique key 를 설정하고 조심해야할 부분은  Primary key 와 마찬가지로  지정한 컬럼에 값을 집어넣는 경우에  이미 존재하고 있는 값을 똑같이 넣게 되어 중복이 된다면 오류가 발생할 것이다. 이점에 대해서 유의하길 바란다. 또한 , 이미 데이터가 중복되어 있을 경우에는 Primary Key 와 Unique Key 로 alter 못하게 된다.


3. Check 제약 [C] 

      -- 하나의 테이블당 여러개를 생성할 수 있다.
      -- insert(입력) 또는 update(수정) 시 어떤 컬럼에 입력되거나 수정되는 데이터값을 아무거나 허락하는 것이 아니라 
      -- 조건에 맞는 데이터값만 넣고자(수정하고자) 할 경우에 사용된다. 
     

    create table tbl_sawon
    (sano       number(5)
    ,saname     Nvarchar2(10) not null
    ,salary     number(5) not null            -- 급여는 커미션보다 커야 한다.
    ,commission number(5)                     -- 커미션은 0 이상이어야 한다.
    ,jik        Nvarchar2(10) default '사원'  -- 직급의 종류는 '사장', '부장' , '과장' , '대리' , '사원'만 가능하다..
    ,email      varchar2(50) not null
    ,constraint CK_tbl_sawon_salary_commission check ( salary > commission and commission >= 0 )
    -- 위의 제약은 기본급여가 커미션보다 커야하고, 커미션은 0 이상이여야 한다는 조건을 부과
    ,constraint CK_tbl_sawon_jik check ( jik in ('사장', '부장' , '과장' , '대리' , '사원') )
    );
    -- 위의 제약은 직급의 종류는 사장, 부장, 과장, 대리, 사원 중 하나만 들어오도록..

- CHECK 제약은 constraint  constraint 명 check ( 조건문 ) 으로 사용된다. check 제약의 조건을 지키지 않는 데이터는 해당 테이블에 넣을 수 없다.


4. Foreign Key(외래키) 제약 (참조키) [R] 

      -- 하나의 테이블당 여러개를 생성할 수 있다.
      -- Foreign Key(외래키) 제약에 의해 참조(Reference)받는 컬럼은 반드시 중복된 값을 허락하지 않는 고유한 값만 가지는 컬럼(Primary Key 또는 Unique Key) 이어야 한다.!!!
      -- 또한 Foreign Key(외래키) 제약에 의해 참조(Reference)받는 컬럼은 NOT NULL 이어야 한다.

 create table tbl_reservation
    ( reservation_no        number        ---> 예약번호. 예약번호의 값은 NOT NULL 이면서 고유한 값만 가져야한다.
                                          ---> 그러므로, reservation_no 컬럼에는 Primary Key 제약을 주어야한다.
                                                             
                                                             --> 예약번호는 사용자가 수동적으로 입력치 않고 자동적으로 들어와야 한다.
                                                             --> 그리고 예약번호는 매번 그 숫자가 증가되면서 고유해야 한다.
                                                             --> 이렇게 되려면, sequence 를 사용하면 된다. 
    , fk_gogekphone          varchar2(20) not null           -- 고객명 
    , constraint PK_tbl_reservation_reservation_no primary key ( reservation_no )
    , constraint FK_tbl_reservation_fk_gogekphone  foreign key (fk_gogekphone ) references tbl_gogek( gogekphone )
    ) ; -- Table TBL_RESERVATION이(가) 생성되었습니다.
    -- 위의 제약이 오류가 없이 나오려면,  tbl_gogek 테이블에서 gogekphone 컬럼은 Unique key 또는
    -- primary key로 되어 있어야 한다.