【SQLite3】データの追加 (INSERT文)

INSERT文を使ってテーブルにデータを追加する方法について記録します。
全てのカラムに値を指定してデータを追加する以外に、カラムを指定してデータを追加することもできます。

## 全てのカラムに値を指定してデータを追加する

```sql:書式
INSERT INTO テーブル名 VALUES(値1, 値2, ...);
```

対象となるテーブルに含まれるカラムと同じ数の値を指定します。
値は記述された順にカラムに格納されていきますので、値を格納したいカラムの順番と同じ順番で値を指定します。

テスト用にテーブルを作成します。

```sql
CREATE TABLE testUSER(id INTEGER, name TEXT, old INTEGER, address TEXT);
```

このテーブルには4つのカラム id、name、old、addressがあります。
このテーブルにデータを追加する場合は、4つの値をカラムの順番に沿って記述して追加します。
例えば 1、'Yamada'、19、'Tokyo'です。では実際にデータを追加してみます。

```sql
INSERT INTO testUSER VALUES(1, 'Yamada', 19, 'Tokyo');
```

エラーが出ないことを確認して、引き続き下記のように、データを追加します。

```sql
INSERT INTO testUSER VALUES(2, 'Mori', 32, 'Kyoto');
INSERT INTO testUSER VALUES(3, 'Ueda', 27, 'Tokyo');
INSERT INTO testUSER VALUES(4, 'Mitsui', 20, 'Nagoya');
```

これでテーブルには4つのデータが追加されました。
SELECT文を使ってテーブルからデータを取得してみます。

```sql
SELECT * FROM testUSER;
```
```sql:実行結果
id          name        old         address   
----------  ----------  ----------  ----------
1           Yamada      19          Tokyo     
2           Mori        32          Kyoto     
3           Ueda        27          Tokyo     
4           Mitsui      20          Nagoya
```
---

## 特定のカラムだけに値を指定してデータを追加する

```sql:書式
INSERT INTO テーブル名(カラム1, カラム2, ...) VALUES(値1, 値2, ...);
```

新たにテーブルを作成します。

```sql
CREATE TABLE testUser2(id INTEGER, name TEXT, address TEXT DEFAULT 'NO VALUE');
```

テーブルには3つのカラムがあり、 address カラムにはデフォルト制約が設定されています。
まずは3つのカラムに全て値を指定してデータを追加します。

```sql
INSERT INTO testUser2(id, name, address) VALUES(1, 'Honda', 'Tokyo');
```

次に2つのカラムだけに値を指定してデータを追加してみます。
1つ目は、idカラムとnameカラムだけ、
2つ目は、idカラムとaddressカラムだけに値を指定してデータを追加します。

```sql
INSERT INTO testUser2(id, name) VALUES(2, 'Okada');
INSERT INTO testUser2(id, address) VALUES(3, 'Mori');
```

これでテーブルには先ほどのと合わせて3つのデータが追加されました。それでは SELECT 文を使ってテーブルからデータを取得してみます。

```sql
SELECT * FROM testUser2;
```
```sql:実行結果
id          name        address   
----------  ----------  ----------
1           Honda       Tokyo     
2           Okada       NO VALUE  
3                       Mori      
```

2つ目のデータを追加した時には、addressカラムの値を指定していなかったのですが、addressカラムにはデフォルト制約が設定されていたためデフォルト値である'no value'が格納されています。

3つ目のデータを追加した時には、nameカラムの値を指定していなかったので、デフォルト値であるNULLが格納されています(NULLは画面上では何も表示されません)。

このようにテーブルに含まれるカラムの中で一部のカラムだけに値を指定してデータを追加することができます。

尚、データを追加する時に記述するカラムの順番はテーブルで定義されているカラムの順番通りである必要はありません。
次の2つは同じ結果となりエラーにもなりません。

```sql
INSERT INTO user(id, name) VALUES(2, 'Ueda');
INSERT INTO user(name, id) VALUES('Ueda', 2);
```

---

## 値を指定せずにデータを追加する
値を1つも指定せずにデータを追加することもできます。この場合は全てのカラムにデフォルトの値が格納されます。

```sql:書式
INSERT INTO テーブル名 DEFAULT VALUES;
```

それでは実際に試してみます。テーブルは先ほどと同じtestUser2をそのまま利用します。

```sql:.schema testUser2
CREATE TABLE testUser2(id INTEGER, name TEXT, address TEXT DEFAULT 'NO VALUE');
```

値を指定せずにデータを追加します。

```sql
INSERT INTO testUser2 DEFAULT VALUES;
```
```sql
SELECT * FROM testUser2;
```
```sql:実行結果
id          name        address   
----------  ----------  ----------
1           Honda       Tokyo     
2           Okada       NO VALUE  
3                       Mori      
                        NO VALUE  
```

追加されたデータは値が指定されていませんので、デフォルト制約が設定されていないidカラム、nameカラムにはデフォルト値のNULLが格納され、デフォルト制約が設定されているaddressカラムには設定されているデフォルト値が格納されました。

このように値を1つも指定せずにデータをテーブルに追加することが可能です。

---
### 本記事目次ページ
[【データベース】SQLite3・JDBCまとめ](https://qiita.com/tsweblabo/items/8fa21f3e9e30885be034)


### 参考サイト
- [DBOnline 初心者でもわかりやすいサイトSQLite入門](https://www.dbonline.jp/sqlite/)