SQLite | 테이블 (Table) | DEFAULT 제약 조건
테이블에 데이터를 추가할 때, 값을 생략한 컬럼은 보통 NULL이 저장되지만 NULL 대신에 기본으로 저장되는 값을 설정할 경우에는 DEFAULT 제약 조건으로 설정한다. 여기에서는 DEFAULT 제약 조건의 사용법에 대해 설명한다.
DEFAULT 제약 조건이란?
컬럼에 DEFAULT 제약 조건을 설정하면, 데이터를 추가할 때 값을 생략할 시에 기본값을 설정할 수 있다. DEFAULT 제약 조건을 컬럼에 설정하는 경우 형식은 다음과 같다.
CREATE TABLE 테이블명 (컬럼명 DEFAULT 값, ...);
기본값은 NULL, 숫자, 문자열을 지정할 수 있다.
그러면 실제로 제약 조건을 설정해 보자. 다음과 같이 테이블을 만든다. price 컬럼와 name 컬럼에는 각각 DEFAULT 제약 조건이 설정되어 있다.
create table product (id integer, name text default 'no name', price integer default 0);
sqlite> create table product (id integer, name text default 'no name', price integer default 0);
sqlite>
우선 몇개의 데이터를 추가해 보자. DEFAULT 제약 조건이 설정되어 있는 컬럼에 값을 지정한 경우에는 지정한 값이 컬럼에 저장된다.
insert into product values (1, 'PC', 75000);
insert into product values (4, 'Desk', 18000);
sqlite> insert into product values (1, 'PC', 75000);
sqlite> insert into product values (4, 'Desk', 18000);
sqlite>
다음은 DEFAULT 제약 조건이 설정되어 있는 name 컬럼의 값을 지정하지 않고, 데이터를 추가하면 컴럼에는 기본값인 ’no name’이 저장된다.
insert into product (id, price) values (6, 18000);
sqlite> insert into product (id, price) values (6, 18000);
sqlite>
sqlite> .mode column
sqlite> .header on
sqlite>
sqlite> select * from product;
id name price
---------- ---------- ----------
4 Desk 18000
1 PC 75000
6 no name 18000
sqlite>
동일하게 DEFAULT 제약 조건이 설정되어있는 price 컬럼의 값을 지정하지 않고, 데이터를 추가하면 컬럼에는 기본값 인 0이 저장된다.
insert into product (id, name) values (8, 'Chair');
sqlite> insert into product (id, name) values (8, 'Chair');
sqlite>
sqlite> select * from product;
id name price
---------- ---------- ----------
4 Desk 18000
1 PC 75000
6 no name 18000
8 Chair 0
sqlite>
이렇게 DEFAULT 제약 조건을 컬럼에 설정하면, 값이 지정되지 않고 데이터가 추가된 경우는 NULL이 아닌 지정한 값이 기본 값으로 저장되도록 할 수 있다.
데이터를 추가한 날짜를 기본값으로 설정
DEFAULT 제약 조건에 지정된 기본 값으로 다음 값을 지정하면 데이터를 추가했을 때 그 당시의 날짜와 시간을 가져 디폴트 값으로 컬럼 가능 할 수 있다.
지정값 | 형식 |
---|---|
CURRENT_TIME | HH : MM : SS |
CURRENT_DATE | YYYY-MM-DD |
CURRENT_TIMESTAMP | YYYY-MM-DD HH : MM : SS |
시간대는 UTC이다. |
그러면 실제로 제약 조건을 설정해 보자. 다음과 같이 테이블을 만든다. date_time 컬럼에 DEFAULT 제약 조건을 설정하고 기본값으로 CURRENT_TIMESTAMP를 지정한다.
create table user (id integer, name text, date_time default CURRENT_TIMESTAMP);
sqlite> create table user (id integer, name text, date_time default CURRENT_TIMESTAMP);
sqlite>
그러면 DEFAULT 제약 조건이 설정되어 date_time 컬럼의 값은 생략하고 데이터를 일부만 추가한다.
insert into user (id, name) values (1, 'devkuma');
insert into user (id, name) values (3, 'kimkc');
sqlite> insert into user (id, name) values (1, 'devkuma');
sqlite> insert into user (id, name) values (3, 'kimkc');
sqlite>
sqlite> select * from user;
id name date_time
---------- ---------- -------------------
1 devkuma 2019-10-22 14:43:07
3 kimkc 2019-10-22 14:43:08
sqlite>
DEFAULT 제약 조건을 설정한 date_time 컬럼에 데이터를 추가했을 때의 날짜와 시간이 저장되어 있는 것을 확인할 수 있다.