본문 바로가기

Oracle

Oracle 테이블 제약조건 정리

데이터 무결성을 유지하기 위해 테이블에 적용하는 제약조건을 정리했습니다.
ERROR 있는 데이터가 들어오는 것을 방지하며, 테이블 설계 시 필수로 고려해야 할 요소입니다.


1. NOT NULL

  • 컬럼에 NULL 값을 허용하지 않습니다.
  • 빈 값 없이 반드시 입력해야 하는 필수 항목에 사용합니다.
CREATE TABLE tb1 (
  name VARCHAR2(100) NOT NULL,
  memo VARCHAR2(100) NULL
);

INSERT INTO tb1 VALUES ('일길동', '메모1');
INSERT INTO tb1(name) VALUES ('이길동');
-- 아래 구문은 오류 발생
-- INSERT INTO tb1(memo) VALUES ('메모2');
-- ORA-01400: NULL을 ("TEST"."TB1"."NAME") 안에 삽입할 수 없습니다

2. UNIQUE

  • 도메인 내에서 값의 중복을 허용하지 않습니다.

2-1. 인라인(INLINE) 방식

CREATE TABLE tb2 (
  id   VARCHAR2(100) UNIQUE,
  name VARCHAR2(100) NOT NULL
);

INSERT INTO tb2 VALUES ('one', '일길동');
INSERT INTO tb2 VALUES ('two', '이길동');
-- INSERT INTO tb2 VALUES ('one', '원길동');
-- ORA-00001: 무결성 제약 조건(TEST.SYS_C004002)에 위배됩니다

2-2. 별도(CONSTRAINT) 지정 방식

CREATE TABLE tb22 (
  id   VARCHAR2(100) NOT NULL,
  name VARCHAR2(100) NOT NULL
);

ALTER TABLE tb22
  ADD CONSTRAINT unique_tb22_id UNIQUE(id);

INSERT INTO tb22 VALUES ('one', '원길동');
-- INSERT INTO tb22 VALUES ('one', '원길동');
-- ORA-00001: 무결성 제약 조건(TEST.UNIQUE_TB22_ID)에 위배됩니다

3. CHECK

  • 컬럼 값이 지정한 조건을 만족할 때만 입력을 허용합니다.

3-1. 단일 조건 예시 (성별)

CREATE TABLE tb3 (
  name   VARCHAR2(100) NOT NULL,
  gender VARCHAR2(100)
);

ALTER TABLE tb3
  ADD CONSTRAINT ck_tb3_gender
    CHECK (gender IN ('남자','여자'));

INSERT INTO tb3 VALUES ('홍길동','남자');
INSERT INTO tb3 VALUES ('이미자','여자');
-- INSERT INTO tb3 VALUES ('이미즈','여자 ');
-- ORA-02290: 체크 제약조건(TEST.CK_TB3_GENDER)이 위배되었습니다

3-2. 복합 조건 예시 (성적 범위)

CREATE TABLE tb33 (
  no   INT CONSTRAINT pk_tb33_no PRIMARY KEY,
  name VARCHAR2(100) NOT NULL,
  kor  INT,
  eng  INT,
  mat  INT
);

ALTER TABLE tb33 ADD CONSTRAINT ck_tb33_kor CHECK (kor BETWEEN 0 AND 100);
ALTER TABLE tb33 ADD CONSTRAINT ck_tb33_eng CHECK (eng BETWEEN 0 AND 100);
ALTER TABLE tb33 ADD CONSTRAINT ck_tb33_mat CHECK (mat BETWEEN 0 AND 100);

-- 제약조건 해제 예시
ALTER TABLE tb33 DROP CONSTRAINT ck_tb33_mat;

조건 위배 시 아래와 같은 오류가 발생합니다.

ORA-02290: 체크 제약조건(TEST.CK_TB33_KOR)이 위배되었습니다

제약조건 목록 확인은 USER_CONSTRAINTS 뷰에서 가능합니다.

SELECT constraint_type,
       constraint_name,
       table_name
  FROM user_constraints
 WHERE table_name = 'TB33';

4. DEFAULT

  • 값을 입력하지 않을 경우 지정한 기본값이 자동으로 설정됩니다.
CREATE TABLE tb4 (
  name    VARCHAR2(100) NOT NULL,
  msg     VARCHAR2(100) NOT NULL,
  regdate DATE DEFAULT SYSDATE
);

INSERT INTO tb4 VALUES ('일길동', '오늘 비오네...', sysdate);
INSERT INTO tb4(name, msg)
     VALUES ('이길동', 'Dante... the son of Sparda...');
INSERT INTO tb4 VALUES ('삼길동', '아버지를 아버지라고 부르지 못하고', DEFAULT);

SELECT name, msg,
       TO_CHAR(regdate, 'YYYY-MM-DD HH24:MI:SS') AS regdate
  FROM tb4;

5. PRIMARY KEY

  • 기본 키 제약조건은 NOT NULL + UNIQUE + INDEX 기능을 결합해 개체 무결성을 보장합니다.
  • 일반적으로 시퀀스를 이용해 일련번호를 자동 생성합니다.
CREATE TABLE tb5 (
  idx     INT,
  name    VARCHAR2(100) NOT NULL,
  msg     VARCHAR2(100) NOT NULL,
  regdate DATE DEFAULT SYSDATE
);

ALTER TABLE tb5
  ADD CONSTRAINT pk_tb5_idx PRIMARY KEY(idx);

CREATE SEQUENCE seq_tb5_idx;

INSERT INTO tb5 VALUES (seq_tb5_idx.NEXTVAL, '일길동', '이제 비가 멈췄네', '2025-08-06');
INSERT INTO tb5 VALUES (seq_tb5_idx.NEXTVAL, '이길동', '비가 다시 오네', SYSDATE);
-- 중복 키 입력 시 ORA-00001 오류 발생

6. FOREIGN KEY

  • 외래 키 제약조건은 참조 무결성(Referential Integrity)을 유지합니다.
  • 자식 테이블 컬럼이 부모 테이블의 기본 키를 참조하도록 설정합니다.
CREATE TABLE 학생 (
  학번     INT CONSTRAINT pk_std_학번 PRIMARY KEY,
  이름     VARCHAR2(100) NOT NULL,
  전화     VARCHAR2(100) NOT NULL,
  보호자명 VARCHAR2(100) NOT NULL,
  보호자직업 VARCHAR2(100) NOT NULL,
  주소     VARCHAR2(100) NOT NULL
);

CREATE TABLE 성적 (
  일련번호  INT CONSTRAINT pk_성적_일련번호 PRIMARY KEY,
  학번      INT,
  국어      INT,
  영어      INT,
  수학      INT,
  학년      INT,
  학기      INT,
  시험종류  VARCHAR2(100) NOT NULL
);

ALTER TABLE 성적
  ADD CONSTRAINT fk_성적_학번
    FOREIGN KEY(학번)
    REFERENCES 학생(학번)
    ON DELETE CASCADE;

INSERT INTO 학생 VALUES (1, '일길동', '111-1111', '일아비', '자영업', '서울');
INSERT INTO 성적 VALUES (1, 1, 90, 80, 70, 1, 1, '중간고사');
-- 존재하지 않는 학번 참조 시 ORA-02291 오류 발생