SQLite | テーブル | DEFAULT制約

行を追加するときにカラム値を省略すると、通常はNULLが保存されます。DEFAULT制約を使うと、代わりに既定値を保存できます。ここでは、その使い方を説明します。

DEFAULT制約とは

DEFAULT制約を設定すると、追加時にカラム値を省略した場合の既定値を指定できます。構文は次のとおりです。

CREATE TABLE テーブル名 (カラム名 DEFAULT 値, ...);

既定値にはNULL、数値、文字列を指定できます。

次のテーブルを作成します。namepriceにはそれぞれ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> 

まず、各カラムの値を明示して行を追加します。指定した値がそのまま保存されます。

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> 

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> 

同様に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ではなく指定した既定値を保存できます。

追加日時を既定値にする

次の値を既定値にすると、行を追加した時点の日付や時刻をカラムに保存できます。

指定値 形式
CURRENT_TIME HH : MM : SS
CURRENT_DATE YYYY-MM-DD
CURRENT_TIMESTAMP YYYY-MM-DD HH : MM : SS
タイムゾーンはUTCです。

date_timeの既定値に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> 

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> 

date_timeに各行を追加した日時が保存されていることを確認できます。