서론
Oracle 데이터베이스에서 테이블을 설계할 때, DEFAULT 제약 조건을 사용하여 열에 기본값을 지정할 수 있습니다. 기본값은 명시적으로 값을 지정하지 않고 행을 삽입할 때 자동으로 적용됩니다. 이 가이드에서는 DEFAULT 열 값을 사용하는 다양한 시나리오와 함께 실무에 즉시 적용 가능한 예시를 제공합니다.
DEFAULT 제약 조건 구문
DEFAULT 제약 조건은 테이블 생성 시 또는 ALTER TABLE 문을 사용하여 기존 열에 추가할 수 있습니다. 기본 구문은 다음과 같습니다:
CREATE TABLE 테이블_이름 (
열_이름 데이터_타입 DEFAULT 기본값,
...
);
ALTER TABLE 테이블_이름
ADD (열_이름 데이터_타입 DEFAULT 기본값);
DEFAULT 열 값 사용 시나리오
1. 자주 사용되는 기본값 설정
특정 열에 대부분의 경우 특정 값이 사용되는 경우, DEFAULT 제약 조건을 사용하여 해당 값을 설정합니다. 예를 들어, 주문 상태를 나타내는 열의 기본값을 ‘접수됨’으로 설정할 수 있습니다.
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
order_date DATE DEFAULT SYSDATE,
order_status VARCHAR2(20) DEFAULT '접수됨'
);
2. NULL 값 방지
특정 열에 NULL 값을 허용하지 않으려면 NOT NULL 제약 조건과 함께 DEFAULT 제약 조건을 사용합니다. 예를 들어, 고객 테이블에서 이메일 주소가 필수로 입력되어야 하는 경우 빈 문자열(”)을 기본값으로 설정할 수 있습니다.
CREATE TABLE customers (
customer_id NUMBER PRIMARY KEY,
customer_name VARCHAR2(50) NOT NULL,
email VARCHAR2(100) NOT NULL DEFAULT ''
);
3. 데이터 타입에 따른 기본값 설정
DEFAULT 제약 조건은 다양한 데이터 타입에 적용할 수 있습니다. 각 데이터 타입에 적합한 기본값을 설정해야 합니다.
- NUMBER: 숫자 값 (예: 0, -1, 3.14)
- VARCHAR2, CHAR: 문자열 값 (예: ‘Unknown’, ”)
- DATE: 날짜 값 (예:
SYSDATE,TO_DATE('2024-01-01', 'YYYY-MM-DD')) - TIMESTAMP: 타임스탬프 값 (예:
SYSTIMESTAMP)
4. 함수를 이용한 동적 기본값 설정
SYSDATE 또는 사용자 정의 함수를 사용하여 동적인 기본값을 설정할 수 있습니다. 예를 들어, 행이 삽입될 때 자동으로 현재 날짜와 시간을 기록하도록 할 수 있습니다.
CREATE TABLE logs (
log_id NUMBER PRIMARY KEY,
log_date DATE DEFAULT SYSDATE,
description VARCHAR2(200)
);
5. 시퀀스를 이용한 자동 증가 값 설정
DEFAULT 제약 조건과 함께 시퀀스를 사용하여 열에 자동 증가 값을 설정할 수 있습니다. 이 방법은 주로 기본 키 열에 유일한 값을 자동으로 할당하는 데 사용됩니다.
CREATE SEQUENCE product_seq
START WITH 1
INCREMENT BY 1;
CREATE TABLE products (
product_id NUMBER DEFAULT product_seq.NEXTVAL PRIMARY KEY,
product_name VARCHAR2(50),
price NUMBER
);
DEFAULT 열 값 사용 예시
예시 1: 기본 정보 테이블 생성
다음은 기본 정보를 저장하는 employees 테이블을 생성하는 예시입니다. hire_date 열에는 기본적으로 현재 날짜가 설정되고, salary 열에는 기본적으로 3000이 설정됩니다.
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
first_name VARCHAR2(50),
last_name VARCHAR2(50),
email VARCHAR2(100) UNIQUE,
phone_number VARCHAR2(20),
hire_date DATE DEFAULT SYSDATE,
salary NUMBER DEFAULT 3000
);
INSERT INTO employees (employee_id, first_name, last_name, email)
VALUES (1, '길동', '홍', 'hong.gildong@example.com');
SELECT * FROM employees WHERE employee_id = 1;
실행 결과:
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL PHONE_NUMBER HIRE_DATE SALARY
---------- ---------- --------- ------------------ ------------ ----------- -------
1 길동 홍 hong.gildong@example.com 2024-05-16 3000
예시 2: 파티션 테이블 생성
다음은 월별로 파티션된 판매 테이블을 생성하는 예시입니다. sales_date 열에는 기본적으로 해당 파티션의 시작 날짜가 설정됩니다.
CREATE TABLE sales (
sale_id NUMBER PRIMARY KEY,
product_id NUMBER,
sales_date DATE,
quantity NUMBER,
amount NUMBER
) PARTITION BY RANGE (sales_date) (
PARTITION sales_jan_2024 VALUES LESS THAN (TO_DATE('2024-02-01', 'YYYY-MM-DD')),
PARTITION sales_feb_2024 VALUES LESS THAN (TO_DATE('2024-03-01', 'YYYY-MM-DD'))
);
ALTER TABLE sales MODIFY PARTITION sales_jan_2024
ADD (sales_date DATE DEFAULT TO_DATE('2024-01-01', 'YYYY-MM-DD'));
ALTER TABLE sales MODIFY PARTITION sales_feb_2024
ADD (sales_date DATE DEFAULT TO_DATE('2024-02-01', 'YYYY-MM-DD'));
INSERT INTO sales (sale_id, product_id, quantity, amount) PARTITION (sales_jan_2024)
VALUES (1, 101, 2, 100);
SELECT * FROM sales PARTITION (sales_jan_2024) WHERE sale_id = 1;
실행 결과:
SALE_ID PRODUCT_ID SALES_DATE QUANTITY AMOUNT
------ ---------- ----------- -------- -------
1 101 2024-01-01 2 100
주의사항
DEFAULT제약 조건은 데이터 타입에 맞는 유효한 값이어야 합니다.DEFAULT제약 조건은NULL값을 명시적으로 삽입하는 것을 막지 못합니다.DEFAULT제약 조건은 하위 호환성을 위해ALTER TABLE문에서ADD키워드와 함께 사용해야 합니다.
결론
DEFAULT 열 값은 데이터베이스 테이블 설계 시 유용하게 활용될 수 있습니다. 자주 사용되는 기본값을 설정하거나, NULL 값 입력을 방지하거나, 시퀀스와 함께 사용하여 유일한 값을 생성하는 데 사용할 수 있습니다. 적절한 DEFAULT 열 값 설정은 데이터 무결성을 향상시키고 애플리케이션 개발을 간소화하는 데 도움이 됩니다.