데이터 무결성을 유지하기 위해 테이블에 적용하는 제약조건을 정리했습니다.
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 오류 발생
'Oracle' 카테고리의 다른 글
Oracle DECODE, CASE, NVL/NVL2, VIEW 함수 정리 및 예제 (4) | 2025.08.08 |
---|---|
Oracle SQL 함수 정리 (3) | 2025.08.08 |
Oracle SQL 조회 및 문자열 연산 정리 (4) | 2025.08.08 |
Oracle 데이터 타입 정리 (0) | 2025.08.06 |
Oracle SQL 기초: system 계정과 test 계정 작업 정리 (3) | 2025.08.06 |