본문 바로가기
Programming/SQL

[Oracle] 15.제약 조건(PK, FK, UK, NOT NULL, CHECK) 설정, 조회 쿼리

by 고막고막 2019. 5. 7.

제약 조건(Constraints)

테이블 단위에서 데이터의 무결성을 보장해주는 규칙.(오류 방지) 테이블에 데이터가 입력, 수정, 삭제되거나 테이블이 삭제, 변경될 경우, 잘못된 트랜잭션이 수행되지 않도록 결함을 유발한 가능성이 있는 작업을 방지하는 역할을 담당한다. 특히 PK와 FK는 테이블의 필수요소로써 모든 테이블은 이들 둘 중 하나 이상을 반드시 포함하고 있다. 오라클에서 제공하는 제약조건의 종류는 다음과 같다.

  1. PRIMARY KEY  테이블 당 하나만 정의 가능하며, 유일하게 식별할 수 있는 컬럼. 고유 인덱스 생성됨.
  2. FOREIGN KEY  자식 테이블에 설정 (반대로, 참조되는 테이블이 부모 테이블. 부모 테이블은 삭제가 불가능해짐) 
  3. UNIQUE KEY  중복 값을 허용하지 않는 고유키. 고유 인덱스 생성됨.
  4. NOT NULL  null 값을 허용하지 않음
  5. CHECK  컬럼에 값이 입력되기 전에 조건을 확인한다 (if 조건이 일치한다면, 값을 입력하겠다)

 

 

제약 조건 설정 쿼리

-테이블 생성 시 PK를 추가한다.

CREATE TABLE board(
  no NUMBER,
  name VARCHAR2(50),
  sub VARCHAR2(100),
  CONSTRAINT board_pk_no PRIMARY KEY (no)
);

-테이블 생성 시 FK를 추가한다.

CREATE TABLE b_content(
  no NUMBER,
  content VARCHAR2(4000), 
  CONSTRAINT content_pk PRIMARY KEY(no),
  CONSTRAINT content_fk FOREIGN KEY(no) REFERENCES board(no)
);

-테이블 생성 시 NOT NULL과 CHECK 조건을 추가한다.

CREATE TABLE emp(
  eno VARCHAR2(4),
  ename VARCHAR2(50) CONSTRAINT emp_nu_ename NOT NULL,
  gno VARCHAR2(13),
  sex VARCHAR2(3),
  CONSTRAINT emp_pk_eno PRIMARY KEY(eno),
  CONSTRAINT emp_uk_gno UNIQUE(gno),
  CONSTRAINT emp_ch_gno CHECK(LENGTH(gno)=13),
  CONSTRAINT emp_ch_sex CHECK(sex IN('남', '여'))
);

여기서 만약 '제약조건이름'을 정의하지 않으면 오라클에서 자동으로 STS_Cn형태의 이름을 붙혀준다!

 

제약 조건 조회 쿼리

-PK, FK로 묶여 있는 부모-자식 관계 조회 (USER_CONSTRAINTS, USER_CON_COLUMNS)

SELECT p.table_name 상위테이블, p.constraint_name 상위제약조건,
       c.table_name 하위테이블, c.constraint_name 하위제약조건
FROM user_constraints p, user_constraints c
WHERE c.r_constraint_name = p.constraint_name
AND p.table_name IN ('BOARD', 'B_CONTENT')
ORDER BY p.table_name;

-NOT NULL과 CHECK 조건 조회 (CONSTRAINT_NAME, SEARCH_CONDITION)

SELECT constraint_name, search_condition
FROM user_constraints
WHERE table_name='EMP';