➕ Step 12: データの挿入(INSERT)
新しいデータを追加してみよう!
- INSERT文でデータを追加する基本
- データ型に応じた値の書き方
- 一部の列だけに値を入れる方法
- 複数行の一括挿入
- デフォルト値とNULLの違い
- 自動採番(AUTOINCREMENT)の仕組み
- INSERT時の注意点とエラー対策
🎯 1. INSERT文とは?
1-1. データベースに新しいデータを追加する
今までは、すでに存在するデータを見る(SELECT)ことだけをやってきました。
でも、データベースを使う上で、新しいデータを追加することも重要です。
- 新しい顧客を登録する
- 新しい商品を追加する
- 新しい注文を記録する
- 新しいユーザーを登録する
そんなときに使うのがINSERT文です!
1-2. INSERT文の基本構文
INSERT INTO テーブル名 (列1, 列2, 列3) VALUES (値1, 値2, 値3);
| 部分 | 意味 | なぜ必要? |
|---|---|---|
INSERT INTO テーブル名 |
どのテーブルに追加するか | 追加先を指定するため |
(列1, 列2, 列3) |
どの列にデータを入れるか | 値を入れる場所を明示するため |
VALUES |
値を指定するためのキーワード | これから値を書くことを示す |
(値1, 値2, 値3) |
実際に入れるデータ | 追加するデータの内容 |
1-3. 練習用テーブルの準備
今回は新しいテーブルを作成して練習しましょう。
ステップ1:顧客テーブルを作成
※横にスクロールできます
| 部分 | 意味 |
|---|---|
顧客ID INTEGER PRIMARY KEY |
整数型の主キー(重複不可) |
顧客名 TEXT NOT NULL |
文字列型、NULLは許可しない(必須) |
メール TEXT |
文字列型、NULLも許可(任意) |
都道府県 TEXT |
文字列型、NULLも許可(任意) |
ステップ2:商品テーブルを作成
※横にスクロールできます
| 部分 | 意味 |
|---|---|
価格 INTEGER NOT NULL |
整数型、NULLは許可しない(必須) |
在庫数 INTEGER DEFAULT 0 |
整数型、デフォルト値は0 |
➕ 2. 基本的なINSERT
2-1. 1行のデータを追加する
まずは、1行だけデータを追加してみましょう。
※横にスクロールできます
| 部分 | 意味 |
|---|---|
INSERT INTO 顧客 |
顧客テーブルにデータを追加 |
(顧客ID, 顧客名, メール, 都道府県) |
値を入れる4つの列を指定 |
VALUES (1, '田中太郎', ...) |
列の順番どおりに値を指定 |
追加できたか確認してみましょう。
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 1 | 田中太郎 | tanaka@example.com | 東京都 |
新しい顧客が追加されました!
2-2. データ型に応じた値の書き方
| データ型 | 書き方 | 例 |
|---|---|---|
| 文字列(TEXT) | シングルクォート’で囲む | '田中太郎' |
| 数値(INTEGER, REAL) | そのまま書く | 150 |
| 日付(DATE) | シングルクォート’で囲む | '2024-11-09' |
| NULL | クォートなしでNULL | NULL |
2-3. 商品を追加してみよう
※横にスクロールできます
確認してみましょう。
※横にスクロールできます
| 商品ID | 商品名 | 価格 | カテゴリ | 在庫数 |
|---|---|---|---|---|
| 101 | りんご | 150 | 果物 | 50 |
📝 3. 一部の列だけに値を入れる
3-1. 必要な列だけを指定する
全ての列に値を入れる必要はありません。必要な列だけを指定できます。
※横にスクロールできます
この場合、指定しなかった列(メールと都道府県)はNULLになります。
確認してみましょう。
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 2 | 佐藤花子 | NULL | NULL |
指定しなかった列はNULLになりました。
3-2. NULLを明示的に入れる
NULLを明示的に入れることもできます。
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 3 | 鈴木次郎 | NULL | 大阪府 |
メールだけがNULLで、都道府県には値が入りました。
3-3. 列名を省略する方法(非推奨)
テーブルの全ての列に値を入れる場合、列名を省略することもできます。
※横にスクロールできます
- 全ての列の値を指定する必要がある
- 値の順番はテーブル定義の順番と完全に一致させる
- 列の順番や数が変わるとエラーになる
- コードが読みにくい(どの値がどの列か分かりにくい)
推奨:列名は省略せず、明示的に書きましょう!
📦 4. 複数行の一括挿入
4-1. VALUESの後にカンマで区切って複数行を指定
1行ずつ追加する代わりに、複数の行をまとめて追加できます。
INSERT INTO テーブル名 (列1, 列2, 列3)
VALUES
(値1, 値2, 値3),
(値4, 値5, 値6),
(値7, 値8, 値9);
4-2. 複数の顧客を一度に追加
※横にスクロールできます
確認してみましょう。
※横にスクロールできます
| 顧客ID | 顧客名 | メール | 都道府県 |
|---|---|---|---|
| 1 | 田中太郎 | tanaka@example.com | 東京都 |
| 2 | 佐藤花子 | NULL | NULL |
| 3 | 鈴木次郎 | NULL | 大阪府 |
| 4 | 高橋美咲 | takahashi@example.com | 神奈川県 |
| 5 | 山田三郎 | yamada@example.com | 福岡県 |
| 6 | 伊藤花子 | ito@example.com | 千葉県 |
| 7 | 渡辺太郎 | watanabe@example.com | 埼玉県 |
3人の顧客が一度に追加されました(緑色の行)!
4-3. 複数の商品を一度に追加
※横にスクロールできます
- 効率的:1回のSQL文で複数行を追加
- 速い:1行ずつより処理が高速
- 読みやすい:関連するデータをまとめて記述
⚙️ 5. デフォルト値とNULL
5-1. デフォルト値とは?
テーブルを作るとき、列にデフォルト値を設定できます。値を指定しなかった場合、自動的にデフォルト値が入ります。
先ほど作った商品テーブルでは、在庫数 INTEGER DEFAULT 0と設定しました。
5-2. デフォルト値を使った挿入
在庫数を指定せずに商品を追加してみましょう。
※横にスクロールできます
確認してみましょう。
※横にスクロールできます
| 商品ID | 商品名 | 価格 | カテゴリ | 在庫数 |
|---|---|---|---|---|
| 106 | コーヒー | 180 | 飲料 | 0 |
在庫数を指定しなかったので、デフォルト値の0が自動的に入りました!
5-3. デフォルト値とNULLの違い
| 項目 | デフォルト値 | NULL |
|---|---|---|
| 意味 | あらかじめ決められた値 | 「値がない」という状態 |
| 設定場所 | テーブル作成時に設定 | 挿入時に指定(または省略) |
| 例 | 在庫数が0 | メールアドレスが未登録 |
| 計算での扱い | 通常の値として計算される | 計算結果がNULLになる |
5-4. 明示的にDEFAULTを指定する
値の代わりにDEFAULTキーワードを使うこともできます。
※横にスクロールできます
この場合も、在庫数にはデフォルト値の0が入ります。
🔑 6. 自動採番(AUTOINCREMENT)
6-1. IDを自動で割り振る仕組み
主キー(ID)は、通常自動で番号を割り振るように設定します。これを自動採番(AUTOINCREMENT)と呼びます。
自動採番を使うと、IDを考える必要がなく、重複も防げます。
6-2. 自動採番テーブルの作成
※横にスクロールできます
| 部分 | 意味 |
|---|---|
PRIMARY KEY |
主キー(一意で必須) |
AUTOINCREMENT |
自動的に連番を割り振る |
6-3. IDを指定せずに挿入
自動採番を使う場合、IDを指定せずに挿入できます。
※横にスクロールできます
注文IDを指定していませんが、自動的に1が割り振られます。
※横にスクロールできます
| 注文ID | 顧客ID | 商品ID | 数量 | 注文日 |
|---|---|---|---|---|
| 1 | 1 | 101 | 3 | 2024-11-01 |
注文IDが自動的に1になりました!
6-4. 複数行を自動採番で追加
※横にスクロールできます
確認してみましょう。
※横にスクロールできます
| 注文ID | 顧客ID | 商品ID | 数量 | 注文日 |
|---|---|---|---|---|
| 1 | 1 | 101 | 3 | 2024-11-01 |
| 2 | 1 | 102 | 5 | 2024-11-03 |
| 3 | 2 | 101 | 2 | 2024-11-05 |
| 4 | 3 | 104 | 4 | 2024-11-08 |
注文IDが2, 3, 4と自動的に連番になりました!
- IDの重複を防げる
- IDを考える必要がない
- データベースが自動管理してくれる
- 実務ではほぼ必須の機能
⚠️ 7. INSERTの注意点とエラー
7-1. 主キーの重複エラー
同じIDで2回挿入しようとすると、エラーになります。
※横にスクロールできます
主キーは重複できません。同じIDのデータは1つだけです。
対策:自動採番(AUTOINCREMENT)を使えば、重複を防げます。
7-2. NOT NULL制約違反
NOT NULL制約がついた列に値を入れないと、エラーになります。
※横にスクロールできます
NOT NULLが設定された列には、必ず値を指定する必要があります。
例:顧客名、商品名、価格など、必須項目に使います。
7-3. データ型の不一致
列のデータ型と異なる値を入れると、エラーになることがあります。
※横にスクロールできます
- 主キーは自動採番を使う
- NOT NULL列には必ず値を入れる
- 数値列には数値、文字列列には文字列を入れる
- 日付は‘YYYY-MM-DD’形式で入れる
🔄 8. SELECTの結果をINSERT
8-1. 他のテーブルからデータをコピー
SELECT文の結果を、そのまま別のテーブルに挿入できます。これはデータのコピーやバックアップに便利です。
INSERT INTO 新テーブル (列1, 列2, ...) SELECT 列1, 列2, ... FROM 元のテーブル WHERE 条件;
8-2. バックアップテーブルの作成
まず、バックアップ用のテーブルを作成します。
※横にスクロールできます
次に、顧客テーブルのデータをコピーします。
※横にスクロールできます
確認してみましょう。
※横にスクロールできます
顧客テーブルの全データがコピーされました!
8-3. 条件付きでコピー
WHERE句を使って、条件に合うデータだけをコピーすることもできます。
※横にスクロールできます
- バックアップ:データの安全なコピー
- データ移行:テーブル間でデータを移動
- 集計結果の保存:計算結果を別テーブルに保存
- 履歴テーブル:変更前のデータを保存
📝 Step 12 のまとめ
| 学んだこと | 内容 |
|---|---|
| INSERT INTO | テーブルに新しいデータを追加する |
| データ型 | 文字列は”で囲む、数値はそのまま |
| 一部の列だけ | 必要な列だけを指定して挿入できる |
| 複数行の一括挿入 | VALUESの後にカンマで区切って複数行 |
| デフォルト値 | 値を省略すると自動的に設定される値 |
| 自動採番 | AUTOINCREMENTでIDを自動割り振り |
| 注意点 | 主キー重複、NOT NULL制約、データ型 |
| SELECT + INSERT | SELECTの結果を別テーブルにコピー |
-- 1行挿入
INSERT INTO テーブル名 (列1, 列2, 列3)
VALUES (値1, 値2, 値3);
-- 複数行挿入
INSERT INTO テーブル名 (列1, 列2, 列3)
VALUES
(値1, 値2, 値3),
(値4, 値5, 値6),
(値7, 値8, 値9);
INSERT文でデータを追加できるようになりました!
次のStep 13では、データの更新(UPDATE)を学びます。既存のデータを変更する方法を学びます。
📝 練習問題
INSERT文を使いこなせるように練習しましょう!
顧客の追加
顧客テーブルに、以下の顧客を追加してください。
- 顧客ID: 10
- 顧客名: 加藤太郎
- メール: kato@example.com
- 都道府県: 愛知県
※横にスクロールできます
解説:列名を指定して、対応する値を順番に入れます。文字列はシングルクォートで囲みます。
商品の追加
商品テーブルに、以下の商品を追加してください。
- 商品ID: 110
- 商品名: ぶどう
- 価格: 300
- カテゴリ: 果物
- 在庫数: 20
※横にスクロールできます
解説:数値(価格、在庫数)はクォートなしで書きます。
NULLを含むデータ
顧客テーブルに、メールアドレスが未登録の顧客を追加してください。
- 顧客ID: 11
- 顧客名: 中村花子
- メール: NULL
- 都道府県: 北海道
※横にスクロールできます
解説:NULLはクォートなしで書きます。’NULL’と書くと文字列になってしまいます。
一部の列だけ指定
顧客テーブルに、顧客IDと顧客名だけを指定して、顧客を追加してください。
- 顧客ID: 12
- 顧客名: 小林次郎
※横にスクロールできます
解説:指定しなかった列(メール、都道府県)はNULLになります。
複数行の一括挿入(顧客)
顧客テーブルに、以下の3人の顧客を一度に追加してください。
- (13, ‘斎藤太郎’, ‘saito@example.com’, ‘京都府’)
- (14, ‘松本花子’, ‘matsumoto@example.com’, ‘兵庫県’)
- (15, ‘井上次郎’, ‘inoue@example.com’, ‘奈良県’)
※横にスクロールできます
解説:VALUESの後に、カンマで区切って複数の行を指定します。
複数行の一括挿入(商品)
商品テーブルに、以下の3つの商品を一度に追加してください。
- (111, ‘いちご’, 400, ‘果物’, 15)
- (112, ‘メロン’, 800, ‘果物’, 10)
- (113, ‘トマト’, 200, ‘野菜’, 30)
※横にスクロールできます
解説:複数の商品を一度に追加できます。
デフォルト値を使った挿入
商品テーブルに、在庫数を指定せずに商品を追加してください(デフォルト値の0が入ります)。
- 商品ID: 114
- 商品名: 新商品テスト
- 価格: 250
- カテゴリ: テスト
※横にスクロールできます
解説:在庫数を省略すると、デフォルト値の0が自動的に入ります。
自動採番で注文を追加
注文テーブルに、注文IDを指定せずに(自動採番で)注文を追加してください。
- 顧客ID: 1
- 商品ID: 103
- 数量: 10
- 注文日: 2024-11-15
※横にスクロールできます
解説:注文IDを指定しなければ、自動で番号が割り振られます(AUTOINCREMENTの場合)。
複数の注文を自動採番で追加
注文テーブルに、以下の3つの注文を注文IDを指定せずに一度に追加してください。
- (顧客ID: 2, 商品ID: 102, 数量: 3, 注文日: ‘2024-11-16’)
- (顧客ID: 3, 商品ID: 105, 数量: 2, 注文日: ‘2024-11-17’)
- (顧客ID: 1, 商品ID: 101, 数量: 5, 注文日: ‘2024-11-18’)
※横にスクロールできます
解説:自動採番でも複数行を一度に挿入できます。
SELECTの結果をINSERT
「東京都」の顧客だけを「顧客バックアップ」テーブルにコピーしてください。
※横にスクロールできます
解説:WHERE句を使って、条件に合うデータだけをコピーします。
❓ よくある質問
Q1: 列名を省略してもいいですか?
全ての列に値を入れる場合は省略できますが、推奨しません。列名を明示した方が、コードが読みやすく、エラーも防げます。
Q2: 主キー(ID)は必ず指定しないといけませんか?
AUTOINCREMENTが設定されていれば、省略できます。自動で番号が割り振られます。実務では、IDは自動採番にするのが一般的です。
Q3: 文字列に’(シングルクォート)を含めたい場合は?
2つ重ねます。例:'It''s a pen' → It’s a pen
Q4: 日付の形式は?
SQLiteでは‘YYYY-MM-DD’形式が標準です。例:’2024-11-09’。時刻を含める場合は’YYYY-MM-DD HH:MM:SS’とします。
Q5: 挿入したデータのIDを確認するには?
SQLiteではSELECT last_insert_rowid();で、最後に挿入された行のIDを取得できます。
Q6: 間違えて挿入したデータを削除するには?
DELETE文を使います(Step 14で学習します)。例:DELETE FROM 顧客 WHERE 顧客ID = 999;
学習メモ
SQL基礎 - Step 12