[오라클] 제약조건 개념

제약조건이란?

테이블에 올바른 데이터만 입력받기 위해서 올바르지 못한 데이터는 입력되지 못하도록 컬럼마다 정하는 규칙입니다.

 

제약조건특징

  • 데이터 무결성 보장하기 위한 용도
  • 컬럼에 대한 속성 정의
  • 테이블이나 속성에 적절치 않은 데이터가 들어오는 것을 방지하기 위한 규칙을 정하는 
  • 데이터베이스의 객체 고유의 이름(제약조건 ) 지정해야 
  • 사용자가 지정하지 않는 경우 ,ORACLE 자동으로 부여

 

제약조건종류

NOT NULL : 해당 컬럼값으로 NULL을 허용하지 않는다.

UNIQUE : 테이블 내에서 해당 컬럼값은 항상 유일한 값을 가진다.

PRIMARY KEY :  NULL을 허용하지 않고 중복된 값을 허용하지 않는다.

FOREIGN KEY : 참조하는 테이블의 컬럼값이 존재하면 허용한다.

CHECK  : 저장된 값의 범위나 조건을 지정하여 설정한 값만 허용한다.

 

PRIMARY KEY 

PRIMARY KEY로 지정한 컬럼은 중복된 값과 NULL값을 입력할 수 없습니다.

( 데이터의 무결성, 중복된 값이 들어가면 안될때 )

FOREIGN KEY로 참조 할 수 있습니다.

primary key 생성 방법입니다. 컬럼 뒤에 바로 붙히는 방법과
constraint로 제약조건의 이름을 정해주고 key로 지정해주는 방법이 있습니다.

 

저렇게 설정해주게 되면 colo 라는 컬럼은 primary key의 속성을 갖게되고 중복,null값을 가질 수 없고 자식 테이블에서 참조 할 수 있게 됩니다. 

 

FOREING KEY 제약조건종류


  • Foreign Key
    가 정의된 테이블이 자식 테이블이다.
     
  • 참조되는 테이블을 부모 테이블이라고 한다. 
  • 부모 테이블은 미리 생성되어 있어야 한다. 
  • 부모 테이블의 참조되는 컬럼에 존재하는 값만을 입력할 수 있다. 
  • 부모 테이블은 Foreign Key로 인해 삭제가 불가능하다.
  • References : 참조할 부모 테이블과 부모 테이블에 있는 컬럼을 정의한다. 
  • on delete cascade : 참조되는 부모 테이블의 행에 대한 delete를 허용한다.
  • ( 부모 테이블의 행이 지워지면 자식 테이블의 행도 같이 지워진다. ) 
  • on delete set null : 참조되는 부모 테이블의 행에 대한 delete를 허용한다.
  • (부모 테이블의 행이 지워지면 자식 테이블의 행은 null 값으로 설정된다. ) 
  • 데이터 타입이 반드시 일치해야 한다.
  • 참조되는 컬럼은 Primary Key거나 Unique만 가능하다.

 

FOREIGN KEY 사용 이유

1. 데이터 무결성 보장

2. DB의 데이터를 효율적으로 관리하기 위해

 

POREIGN KEY 사용방법

 

제약조건에 위배되는 작업을 실행시 어떤 문제가 발생하는지 알아보겠습니다.

 

1. 부모테이블의 참조당하는 키값에 없는 값을 자식테이블에서 입력하려고 할 때 ( INSERT )

------------부모테이블생성
create table region(
region_id number primary key,
region_name varchar2(50)
);

------------자식테이블생성 ( REGION테이블을 부모테이블로 설정하고 REGION 컬럼을 왜래로 설정 )
create table country(
country_id varchar2(10),
country_name varchar2(50),
region_id number,
constraint region_id_fk foreign key(region_id) references region(region_id) --왜래키지정문법
);

--부모테이블에 값 추가
insert into region(region_id, region_name) values(1,'asia');
insert into region(region_id, region_name) values(2,'america');
insert into region(region_id, region_name) values(3,'europe');

-----------------------------------country 테이블 insert 문

--자식테이블에 값 추가
insert into country(country_id, country_name, region_id) values('AA', 'Korea', 1);
insert into country(country_id, country_name, region_id) values('AB', 'Canada', 2);
insert into country(country_id, country_name, region_id) values('AC', 'Australia', 3);

위에 코드에서 부모테이블에서 PRIMARY KEY를 생성하고, 자식테이블에서 FOREIGN KEY를 이용해 부모테이블의 컬럼을 참조하면서 테이블 생성해주었습니다.

그리고 각 테이블에 값을 넣어주겠습니다.

insert into country(country_id, country_name, region_id) values('AD', 'North Korea', 4); 

자식테이블에서 부모테이블의 REGION_ID에 없는 값을 넣어보려하면 오류가 나게 됩니다.
( 부모테이블에서 1,2,3 의 값밖에 없기 때문)

위의 제약조건 종류에 "부모 테이블의 참조되는 컬럼에 존재하는 값만을 입력할 수 있다. " 에 위배됩니다.

오류 메세지를 보면 부모키에서 찾을수 없다는 것을 볼 수 있습니다.

 

2. 자식테이블에 존재하는 값을 부모테이블에서 삭제하려고 할 때 ( DELETE ) 

delete region where region_id = 1;

부모테이블에서 REGION_ID 값이 1인것을 삭제하려 해보겠습니다. 
그러면 자식테이블에도 참조하고있는 값이 있기 때문에 아래와 같은 오류가 뜨게 됩니다.

 

삭제하는 방법 1.

alter table country drop constraint region_id_fk;

 COUNTRY 테에블에 걸려있는 제약조건을 삭제해줍니다.

위의 방법을 이용하게되면 부모테이블에서 삭제해도 자식테이블에서는 값이 남아있게 됩니다.

 

삭제하는 방법 2.

alter table country add constraint region_id_fk
foreign key(region_id) references region(region_id)
on delete cascade;

부모 테이블에 설정되어잇는 기본키값으로 설정된 값을 지우려고했을때 ON DELETE CASCADE옵션을 사용하면 자식테이블이 참조하는중인 것까지 삭제합니다. ( 연쇄 삭제 )
주로 관계된 테이블이 많고 같이 삭제되어야 할때 사용합니다.
위의 명령을 실행하고 부모테이블의 PRIMARY KEY중 하나를 삭제하면 자식테이블의 FOREING KEY로 설정된 것과 같은 값들은 전부 지워지게 됩니다.

 

 

댓글

Designed by JB FACTORY