【SQL】INSERT:デフォルト値

  • #SQL

デフォルト値を挿入する

  • テーブルの列にデフォルト値(初期値)を設定することができる
  • デフォルト値を設定するためには、CREATE TABLE文の中で「DEFAULT制約」をつける
CREATE TABLE ShohinIns
(
  shohin_id CHAR(4) NOT NULL,
  shohin_mei VARCHAR(100) NOT NULL,
  shohin_bunrui VARCHAR(32) NOT NULL,
  
  /* 「DEFAULT 0」で
		  販売単価のデフォルト値を0に設定 */
  hanbai_tanka INTEGER DEFAULT 0,
  
  shiire_tanka INTEGER,
  torokubi DATE,
  PRIMARY KEY(shohin_id)
);

デフォルト値の利用方法

1. 明示的にデフォルト値を挿入する

VALUES句にDEFAULTキーワードを指定する

/* 「hanbai_tanka」に
	 「DEFAULT」を割り当てる */
INSERT INTO ShohinIns
(
  shohin_id, shohin_mei, shohin_bunrui, hanbai_tanka, shiire_tanka, torokubi
) VALUES (
  '0007', 'おろしがね', 'キッチン用品', DEFAULT, 790, '2009-04-28'
);

/* 「hanbai_tanka」は0になっている */
 shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
-----------+------------+---------------+--------------+--------------+------------
 0007      | おろしがね | キッチン用品  |            0 |          790 | 2009-04-28

2. 暗黙的にデフォルト値を挿入する

デフォルト値が設定されている列を、列リスト、値リストからも省略する

INSERT INTO ShohinIns
(
/* 「hanbai_tanka」を省略 */
  shohin_id, shohin_mei, shohin_bunrui, shiire_tanka, torokubi
) VALUES (
/* 値の記述も省略 */
  '0007', 'おろしがね', 'キッチン用品', 790, '2009-04-28'
);

/* 「hanbai_tanka」は0になっている */
 shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
-----------+------------+---------------+--------------+--------------+------------
 0007      | おろしがね | キッチン用品  |            0 |          790 | 2009-04-28

どちらを使ってもいいけど「1. 明示的にデフォルト値を挿入する」ほうが、ぱっと見たときに分かりやすい


デフォルト値の設定していない列を省略→NULLになる

デフォルト値が設定されていない列を省略した場合、NULLが割り当てられる →NOT NULL制約がつけられている列を省略するとエラーになる

/* 「shiire_tanka」を省略
	「NOT NULL制約」なし */
INSERT INTO ShohinIns
(
  shohin_id, shohin_mei, shohin_bunrui, hanbai_tanka, torokubi
) VALUES (
  '0008', 'ボールペン', '事務用品', 100, '2009-11-11'
);

/* 「shiire_tanka」は
  NULLになっている */
 shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
-----------+------------+---------------+--------------+--------------+------------
 0008      | ボールペン | 事務用品      |          100 |              | 2009-11-11

/* 「shohin_mei」を省略
	「NOT NULL制約」あり */
INSERT INTO ShohinIns
(
  shohin_id, shohin_bunrui, hanbai_tanka, shiire_tanka, torokubi
) VALUES (
  '0009', '事務用品', 1000, 500, '2009-12-12'
);

/* エラーが出る */
ERROR:  null value in column "shohin_mei" of relation "shohinins" violates not-null constraint
DETAIL:  Failing row contains (0009, null, 事務用品, 1000, 500, 2009-12-12).

【整理】列を省略したときの動き

DEFAULT設定あり DEFAULT設定なし
NOT NULL制約なし デフォルト値が入る NULLが入る
NOT NULL制約あり デフォルト値が入る エラーになる

INSERTのまとめ:データの登録とNOT NULL/この記事/他のテーブルからコピーする

参考書籍:ミック『SQL 第2版 ゼロからはじめるデータベース操作』(翔泳社)