Database/Oracle

Oracle DB) 제약 조건: Primary Key, Foreign key, Unique, Not Null, Check

luana_eun 2022. 3. 15. 18:22
728x90

제약조건이란?

데이터의 무결성을 지키기 위한 제한된 조건.

특정 데이터를 입력 할 때 무조건 입력되는 것이 아닌, 지정한 조건을 만족했을 때 입력되도록 제약한다.

종류: Primary key, Foreign key, Unique, Not Null, Check

 

 

제약조건 선언 시기

1) 데이블 생성 시: create구문으로 테이블 선언 시.

2) 테이블 생성 후: alter 구문으로 수정한다.

 

 

제약조건명

사용자(개발자)가 지정. 고유하고 의미있는 이름 부여.

권장 이름: 테이블명의 약자_컬럼명 약자_제약조건 유형의약자

ex) emp_empid_pk

     emp_email_uk

     dept_dname_nn

     dept_sal_f     => 한글자씩으로만 줄여써도된다. 잘 알아볼 수 있도록 편리하게!

 

제약조건명은 생략할수 있다. 생략을 하면 sys_cㅁㅁㅁㅁㅁ 패턴으로 자동부여되는데, 

나중에 제약조건이 안맞아서 에러 표시가 날때 sys_c000333 이런식으로 떠서 알기가 힘들다. 

따라서 제약조건 할시 귀찮더라도 제약조건명을 부여하는것을 권장한다. 

 

 

 

제약조건 종류

1. Primary key

   기본키 제약조건

   not null + unique 성격을 모두 가진 제약조건 = null값, 중복값이 들어갈 수 없다. 

   테이블 당 한번만 선언 가능. 

 

 

2. Foreign key

   외래키 제약조건

   자기 자신 테이블이나 다른 테이블에 있는 특정 컬럼을 참조하는 제약조건.

   이 제약조건에 이해 테이블들이 서로 연결되어 운영된다. 

   주의!! 참조하는 테이블의 컬럼은 PK, UK중에 하나는 무조건 설정되있어야 참조될 수 있다. 

 

   제약조건 선언시 => column level 문법 - Foreign key 키워드 생략 가능.

                              table level 문법 - Foreign key 키워드 생략 불가.

 

 

3. Unique

   중복값이 아닌, 고유한 값만 들어갈 수 있다.

 

 

4. Not Null

   null값이 들어갈 수 없음. 주로 필수 입력조건에 사용한다. 

   테이블 레벨의 문법으로 제약조건을 지정할 수 없다. 

 

 

5. Check

   해당 컬럼이 만족해야하는 조건문을 지정하는 제약조건. (사용자가 자유자제로 조건 걸기!)

   column level 문법과 table level 문법이 같다. 

ex)
컬럼 레벨:   salary number(10) constraint 제약조건명 check (salary > 0)
테이블 레벨: constraint 제약조건명 check (salary > 0)

ex)
컬럼 레벨:   주민번호 varchar2(13) constraint 제약조건명 check (length(주민번호) = 13)
테이블 레벨:  constraint 제약조건명 check (length(주민번호) = 13)

ex)
컬럼 레벨:   gender varchar2(10) constraint 제약조건명 check (gender in ('남','여'))
테이블 레벨: constraint 제약조건명 check (gender in ('남','여'))

 

 

 

 

제약조건 선언 방법

1) 컬럼 레벨 문법(column-level)

컬럼명 데이터타입 CONSTRAINT 제약조건명 제약조건
create table employee {
  employee_id number(6) CONSTRAINT emp_empid_pk PRIMARY KEY,
  first_name varchar(20),
  ...
}

--제약조건 생략시
create table employee {
  employee_id number(6) PRIMARY KEY,
}

 

2) 테이블 레벨 문법(table-level)

    ** NOT NULL 제약조건은 테이블 레벨의 문법을 사용할 수 없다. 

CONSTRAINT 제약조건명 제약조건 (컬럼명)
create table employee (
  employee_id number(6),
  first_name varchar(20),
  ...
  CONSTRAINT emp_empid_pk PRIMARY KEY (employee_id)
)

--제약조건 생략시
create table employee (
  employee_id number(6),
  first_name varchar(20),
  ...
  PRIMARY KEY (employee_id)
)

 

 

 

제약조건 Foreign Key 선언방법

1) 컬럼 레벨의 문법

    이 방식은 references 키워드만봐도 외래키 인걸 아니까 foreign key 키워드를 생략할 수 있다. 

CREATE table employee(
  dept_id number(4) constraint emp_deptid_fk REFERENCES departments(dept_id),
  ...
);

2) 테이블 레벨의 문법.

    테이블 레벨은 어떤 컬럼명인지를 적어야해서 foreign key 키워드를 생략할 수 없다. 

CREATE table employee(
  dept_id number(4),
  ...
  constraint emp_deptid_fk FOREIGN KEY (dept_id) REFERENCES departments(dept_id),
);

 

 


제약조건 확인

https://luanaeun.tistory.com/175

 

Oracle DB) 제약 조건 확인하기(SQLPlus, Developer)

제약조건 확인 테이블을 생성 후 desc 명령으로는 not null외의 제약조건은 확인할 수 없다. null외의 제약조건을 확인하려면 user_constrange 라는 DB사전을 사용해야한다. select constraint_name, constraint_..

luanaeun.tistory.com

 

728x90