2021年4月3日土曜日

SQLite 3 デフォルト値だけの行を登録する

概要

通常のinsert文ではカラムに値を指定しなかった場合デフォルト値が入る。
一行丸ごとデフォルト値にしたい場合、値に「default values」を指定すればいい。

デフォルト値が設定されていないカラムはnullになる。

利用にあたってはテーブルのスキーマを確認しておくこと。

構文


insert into table_name default values;
                    

実行例

環境
  • Windows 10
  • sqlite3 Command-Line Shell ver 3.34.1
サンプルテーブル
カラム名 データ型 デフォルト値
id integer (自動採番)
name text 'no name'
mail text 'team@example.com'
create_date text データの挿入日
update_date text (なし)

sqlite> --# 1.
sqlite> create table sample_table (
   ...>     id integer primary key autoincrement
   ...>     , name text default 'no name'
   ...>     , mail text default 'team@example.com'
   ...>     , create_date text default current_timestamp
   ...>     , update_date text
   ...> );

sqlite> --# 2.
sqlite> insert into sample_table default values;

sqlite> --# 3.
sqlite> .mode box
sqlite> .nullval (null)

sqlite> --# 4.
sqlite> select * from sample_table;
┌────┬─────────┬──────────────────┬─────────────────────┬─────────────┐
│ id │  name   │       mail       │     create_date     │ update_date │
├────┼─────────┼──────────────────┼─────────────────────┼─────────────┤
│ 1  │ no name │ team@example.com │ 2021-03-07 08:25:58 │ (null)      │
└────┴─────────┴──────────────────┴─────────────────────┴─────────────┘
                    
  1. サンプルテーブルを作成
  2. デフォルト値の行を追加
  3. selectの表示結果を見やすくする
  4. 追加した結果を確認

not null などの制約がある場合

not nullや外部キー制約に違反する場合はエラーになる。

以下はnot null制約が設定されているカラムに対し、 「insert ~ default values」を実行しようとした例。

サンプルテーブル
カラム名 データ型 デフォルト値
id integer (自動採番)
name text 'no name'
mail text 'team@example.com'
create_date text データの挿入日
update_date text not null

sqlite> create table sample_table (
   ...>     id integer primary key autoincrement
   ...>     , name text default 'no name'
   ...>     , mail text default 'team@example.com'
   ...>     , create_date text default current_timestamp
   ...>     , update_date text not null
   ...> );
sqlite> insert into sample_table default values;
Error: NOT NULL constraint failed: sample_table.update_date
                    

triggerでは使えない

trigger内では「insert ~ default values」はサポートされておらず、作成時にエラーになる。


sqlite> create trigger
   ...>    new_trigger
   ...> before insert on
   ...>    sample_table
   ...> begin
   ...>    insert into update_log default values;
   ...> end;
Error: near "default": syntax error
                    

参考サイト