라일락 꽃이 피는 날

[Oracle] 제약 (constraint) 1 본문

프로그래밍/Oracle

[Oracle] 제약 (constraint) 1

eunki 2022. 6. 14. 17:32
728x90

제약 (constraint)

데이터의 품질을 높이기 위해서 사용하는 데이터 베이스 오브젝트

 

 

제약의 종류

1. primary key 제약 : 해당 테이블을 대표하는 컬럼에 거는 제약

   이 제약이 걸리면 해당 컬럼에는 중복된 데이터와 null 값을 입력할 수 없다.

2. unique 제약 : 중복된 데이터를 입력하지 못하게 하는 제약

3. not null 제약 : null 값을 입력하지 못하게 하는 제약

4. check 제약 : 사용자가 허락한 데이터만 입력하게끔 하는 제약

5. foreign key 제약 : 자식 테이블에 거는 제약 (부모 테이블에게 의존할 자식 테이블)

 

 

 

 


 

 

[테이블에 제약 걸기]

 

1. 테이블을 생성할 때 제약을 거는 방법

 

1-1. column level (컬럼 레벨)

-- primary key 제약
create table dept2
( deptno number(10) constraint dept2_deptno_pk primary key,
  dname varchar2(14),
  loc   varchar2(10) );

dept2_deptno_pk : 제약 이름 = 테이블명_컬럼명_제약

dept2 테이블의 deptno 에는 중복된 데이터와 null 값이 입력될 수 없다.

 

 

-- unique 제약
create table emp507
( empno number(10),
  ename varchar(20) constraint emp507_ename_un unique,
  sal   number(10) );

 

 

-- not null 제약 (column level 로만 가능)
create table emp407
( empno number(10) constraint emp407_empno_nn not null,
  ename varchar2(10) constraint emp407_ename_nn not null,
  sal number(10) );
-- not null 제약
create table emp408
( empno number(10) not null,
  ename varchar2(20) not null,
  sal number(10) );

not null 제약을 제약 이름을 만들지 않고 만들면 오라클이 알아서 제약 이름을 부여하게 된다.

그렇게 되면 나중에 제약을 삭제할 때 불편할 수 있다.

 

 

 

1-2. table level (테이블 레벨)

-- primary key 제약
create table dept3
( deptno number(10),
  dname varchar2(14),
  loc   varchar2(10),
  constraint dept3_deptno_pk primary key(deptno) );

 

 

-- unique 제약
create table emp508
( empno number(10),
  ename varchar(20),
  sal   number(10),
  constraint emp508_ename_un unique(ename) );

 

 

 

 

2. 이미 만들어진 테이블에 제약을 거는 방법

특정 컬럼에 primary key 제약이나 unique 제약을 걸게 되면 인덱스가 자동으로 생성된다.

-- primary key 제약
alter table dept
    add constraint dept_deptno_pk primary key(deptno);

위의 명령어가 실행되었다는 것은 dept 테이블의 deptno 에 중복된 데이터나 null 값이 없었기 때문이다.

만약에 중복된 부서 번호가 있었거나 null 값이 있었다면 위의 명령어는 수행이 안 되고 에러가 났을 것이다.

 

 

-- unique 제약
alter table emp
    add constraint emp_ename_un unique(ename);

위의 명령어가 성공적으로 수행되었다면 emp 테이블의 ename 에 중복된 데이터가 없었기 때문이다.

 

 

-- not null 제약
alter table emp
    modify sal constraint emp_sal_nn not null;

이미 기존 데이터에 null 값이 존재하면 not null 제약이 걸리지 않는다.

유일하게 not null 제약만 modify 를 쓰고 나머지 제약은 전부 add 를 사용한다.

 

 

 

 

[테이블에 걸린 제약 확인]

select  t.table_name, t.constraint_name, c.column_name, t.constraint_type
  from  user_constraints t, user_cons_columns c
  where  t.constraint_name = c.constraint_name
   and   t.table_name='테이블명';

user_constraints 와 user_cons_columns 는 제약을 확인하는 데이터 사전이다.

테이블의 어느 컬럼에 어떤 제약이 걸려있는지 확인할 때 사용한다.

이때 테이블명은 반드시 대문자로 기술해줘야 한다.

데이터 분석하기에 앞서서 정확한 데이터 분석을 위해 분석할 테이블에 제약이 있는지 확인해야 한다.

 

 

 

 

[테이블에 걸린 제약 삭제]

alter table 테이블명
    drop constraint "제약 이름";
728x90