【SQL】INSERT:データの登録とNOT NULL

  • #SQL

CREATE TABLE文でテーブルを作成したあと、INSERT文でデータを挿入する

/* まずテーブルを作成する
(商品テーブル insert学習用) */
CREATE TABLE ShohinIns
(
  shohin_id CHAR(4) NOT NULL,
  shohin_mei VARCHAR(100) NOT NULL,
  shohin_bunrui VARCHAR(32) NOT NULL,
  hanbai_tanka INTEGER DEFAULT 0,
  shiire_tanka INTEGER,
  torokubi DATE,
  PRIMARY KEY(shohin_id)
);
INSERT INTO ShohinIns
(
	/* 列リスト */
  shohin_id, shohin_mei, shohin_bunrui, hanbai_tanka, shiire_tanka, torokubi
) VALUES (
	/* 値リスト */
  '0001', 'Tシャツ', '衣服', 1000, 500, '2009-09-20'
);

/* 実行結果 */
 shohin_id | shohin_mei | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
-----------+------------+---------------+--------------+--------------+------------
 0001      | Tシャツ    | 衣服          |         1000 |          500 | 2009-09-20
  • 文字列型、日付型:シングルクォーテーションで囲む
  • 列名のリストと値のリストは、列数を一致させて書く
  • 原則、INSERT文は1回の実行で1行を挿入する
    (複数行を挿入するときは行数だけ繰り返す)

列リストの省略

テーブルの全列に対してINSERTを行う場合、列リストを省略できる

/* 列リストあり */
INSERT INTO ShohinIns
(
  shohin_id, shohin_mei, shohin_bunrui, hanbai_tanka, shiire_tanka, torokubi
) VALUES (
  '0005', '圧力鍋', 'キッチン用品', 6800, 5000, '2009-01-15'
);

/* 列リスト省略 */
INSERT INTO ShohinIns VALUES (
  '0005', '圧力鍋', 'キッチン用品', 6800, 5000, '2009-01-15'
);

NULLを挿入する

INSERT文である列にNULLを割り当てたいとき、値リストにNULLをそのまま記述する

/* shiire_tankaにNULLを割り当てる */
INSERT INTO ShohinIns
(
  shohin_id, shohin_mei, shohin_bunrui, hanbai_tanka, shiire_tanka, torokubi
) VALUES (
  '0006', 'フォーク', 'キッチン用品', 500, NULL, '2009-09-20'
);

【注意】

  • NULLを割り当てられる列は「NOT NULL制約のついていない列」のみ
  • NOT NULL制約のついている列にNULLを割り当てた場合はエラーとなる
/* NOT NULL制約のついている
「shohin_bunrui」にNULLを割り当てる */

INSERT INTO ShohinIns
(
  shohin_id, shohin_mei, shohin_bunrui, hanbai_tanka, shiire_tanka, torokubi
) VALUES (
  '0006', 'フォーク', NULL, 500, 400, '2009-09-20'
);

/* エラーが出る */
ERROR:  null value in column "shohin_bunrui" of relation "shohinins" violates not-null constraint

複数行を挿入する

1回で複数行を挿入することも可能(multi row insert)

/* 3行を挿入する */
INSERT INTO ShohinIns VALUES
  ('0002', '穴あけパンチ', '事務用品', 500, 320, '2009-09-20'),
  ('0003', 'カッターシャツ', '衣服', 4000, 2800, NULL),
  ('0004', '包丁', 'キッチン用品', 3000, 2800, '2009-09-20');

 shohin_id |   shohin_mei   | shohin_bunrui | hanbai_tanka | shiire_tanka |  torokubi  
-----------+----------------+---------------+--------------+--------------+------------
 0001      | Tシャツ        | 衣服          |         1000 |          500 | 2009-09-20
 0002      | 穴あけパンチ   | 事務用品      |          500 |          320 | 2009-09-20
 0003      | カッターシャツ | 衣服          |         4000 |         2800 | 
 0004      | 包丁           | キッチン用品  |         3000 |         2800 | 2009-09-20

【注意】

  • エラーが出たとき、どの行のどこの箇所がエラーなのか特定しにくい
  • 上記の構文が使用できないRDBMSがある
    ◯:DB2、SQL Server、PostgreSQL、MySQL
    ✗:Oracle

INSERTのまとめ:この記事/デフォルト値/他のテーブルからコピーする

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