DEFAULT 열 값 사용 시기

서론

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 열 값 설정은 데이터 무결성을 향상시키고 애플리케이션 개발을 간소화하는 데 도움이 됩니다.

위로 스크롤