>>>> 오라클의 제약조건(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로 되어 있어야 한다.