【MySQL】INSERT文の書き方:サンプル多数あり

ここでは、MySQLデータベースで、表にデータを追加・登録するSQL、INSERT文について紹介します。

INSERT文の基本構文に加えて、たくさんのサンプルを掲載していますのでぜひ参考にしてください。

INSERT文の基本構文

INSERT文の基本的な構文・文法は次の通りです。

データを登録したいテーブルと列名を列挙し、列に登録したい値をセットします。

INSERT INTO テーブル名(列名) VALUES (値);

UPDATEやカラム追加について

INSERT文は、あくまでテーブルにレコードを登録するSQLです。

そのためレコードの更新やテーブルに対して新しいカラムを追加することは出来ません。

レコードの更新はUPDATE文、カラムの追加はALTER TABLE文で行います。
詳しくは↓で紹介していますので参考にしてください。
>>【MySQL】UPDATE文の書き方:サンプル多数あり
>>【MySQL】テーブルの属性を追加・変更・削除する方法

INSERT文のSQLサンプル

1つのテーブルに1行をINSERT

INSERT文を使うことでテーブルにレコードを追加することが出来ます。

テーブル名の後ろのカッコ内に列名を列挙します。そしてVALUESの後ろのカッコ内に列挙した列に対応させるように順番に値を列挙していきます。

INSERT INTO テーブル名(列名1) VALUES (値1);

次の例では、tab1テーブルに1件レコードを追加しています。

カラム指定した「emp_id,emp_name,dept,age」に対応させるように値を「’00001′,’Suzuki’,’D0001′,28」とセットして登録しています。

mysql> INSERT INTO tab1(emp_id,emp_name,dept,age)
    -> VALUES('00001','Suzuki','D0001',28);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | D0001 |   28 |
+--------+----------+-------+------+
1 row in set (0.00 sec)

1つのテーブルに複数行をINSERT

INSERT文では、VALUESで値のリストをカンマ区切りで指定することで、複数のレコードを1件のINSERT文で一括登録することが出来ます。

INSERT INTO テーブル名(列名1,列名2...) VALUES(値1,値2...),(値1,値2...)...;

次の例では、tab1テーブルに3件のレコードを1回のINSERT文で登録しています。

mysql> INSERT INTO tab1(emp_id,emp_name,dept,age)
    -> VALUES('00001','Suzuki','D0001',28)
    ->      ,('00002','Tanaka','D0002',25)
    ->      ,('00003','Kizaki','D0002',35);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | D0001 |   28 |
| 00002  | Tanaka   | D0002 |   25 |
| 00003  | Kizaki   | D0002 |   35 |
+--------+----------+-------+------+
3 rows in set (0.00 sec)

カラム指定と省略

INSERT文ではカラム指定する方法と省略する方法があります。

カラム指定とは、次のようにテーブル名の後にカラム名を列挙して指定することです。

カラムを指定する場合は、指定したカラムに対応する値(値の個数、順番、データ型、サイズ)をVALUESでセットします。

INSERT INTO tab1(emp_id,emp_name,dept,age) VALUES('00001','Suzuki',28);

カラム名を省略するとは、次のようにテーブルの後ろに列挙したカラム名を記述しない方法です。

カラム名を省略する場合は、テーブルのもつ全てのカラムに対応する値をセットする必要があります。

INSERT INTO tab1 VALUES('00001','Suzuki','D0001',28);

次の例のように、値が不足しているとエラーになるので注意が必要です。

mysql> INSERT INTO tab1 VALUES('00001','Suzuki','D0001');
ERROR 1136 (21S01): Column count doesn't match value count at row 1

値の省略

INSERT文では指定したカラムだけに値をセットしレコードを登録することが出来ます。

次の例では、tab1テーブルへINSERT文を発行する際、dept列を省略しています。カラム指定に対応させるように、VALUESの値も3つにしています。

結果は、指定した列にはセットした値が登録されています。dept列にはNULL値が設定されています。省略された列にデフォルト値が設定されている場合はデフォルト値が登録されます。

mysql> INSERT INTO tab1(emp_id,emp_name,age) VALUES('00001','Suzuki',28);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tab1;
+--------+----------+------+------+
| emp_id | emp_name | dept | age  |
+--------+----------+------+------+
| 00001  | Suzuki   | NULL |   28 |
+--------+----------+------+------+
1 row in set (0.00 sec)

デフォルト値の設定がない、かつNOT NULL制約がある場合に、値を省略すると次のようにデフォルト値がないというエラーが発生するので注意が必要です。

この場合はINSERT文での値の設定、またはカラムにデフォルト値の設定が必要です。

mysql> INSERT INTO tab1(emp_id,emp_name,age) VALUES('00001','Suzuki',28);
ERROR 1364 (HY000): Field 'dept' doesn't have a default value

固定値やNULL値のINSERT

INSERT文では、固定値やNULL値を登録することが出来ます。

・固定値(文字列):シングルクォーテーションで囲んで記述します。
・数値:シングルクォーテーションなしで記述します。
・NULL値:NULLと記述します。

mysql> INSERT INTO tab1 VALUES('00001','Suzuki',NULL,28);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM tab1;
+--------+----------+------+------+
| emp_id | emp_name | dept | age  |
+--------+----------+------+------+
| 00001  | Suzuki   | NULL |   28 |
+--------+----------+------+------+
1 row in set (0.00 sec)

複数テーブルに1行でINSERT

INSERT文を;(セミコロン)で区切って実行することで、1行で複数テーブルへレコードを登録することが出来ます。

INSERT INTO 表名(列名) VALUES (値);INSERT INTO 表名(列名) VALUES (値);

次の例では、tab1とtab2テーブルの2つのテーブルに1行でレコードをINSERTしています。

mysql> INSERT INTO tab1 VALUES('00001','Suzuki','D0001',28);INSERT INTO tab2 VALUES('D0001','HR');
Query OK, 1 row affected (0.03 sec)

Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | D0001 |   28 |
+--------+----------+-------+------+
1 row in set (0.00 sec)

mysql> SELECT * FROM tab2;
+-------+-----------+
| dept  | dept_name |
+-------+-----------+
| D0001 | HR        |
+-------+-----------+
1 row in set (0.00 sec)

ちなみにORACLEデータベースでは、INSERT ALL~という書き方でマルチテーブルインサートが可能です。

MySQLでも使用できるか試してみましたが、ver5.7では↓のように構文エラーとなりました。

mysql> INSERT ALL
    ->  INTO tab1 VALUES('00001','Suzuki','D0001',28)
    ->  INTO tab2 VALUES('D0001','HR')
    -> SELECT * FROM dual;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ALL
 INTO tab1 VALUES('00001','Suzuki','D0001',28)
 INTO tab2 VALUES('D0001','HR' at line 1

SET句を使ったINSERT

INSERT文はVALUESではなく、SET句を使い値を指定することもできます。

INSERT INTO 表名 SET 列名1 = 値1,列名2 = 値2...;

次の例ではtab1テーブルにSET句で値を指定してレコードを登録しています。

mysql> INSERT INTO tab1
    -> SET emp_id='00001',emp_name='Suzuki',dept='D0001',age=28;
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | D0001 |   28 |
+--------+----------+-------+------+
1 row in set (0.00 sec)

省略したカラムはデフォルト値が設定されます。デフォルト値がない場合はNULL値が設定されます。

↓の例ではdept列のみdefault値のtestという文字列が、emp_name,ageにはNULLが登録されました。

mysql> INSERT INTO tab1 SET emp_id = '00001';
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM tab1;
+--------+----------+------+------+
| emp_id | emp_name | dept | age  |
+--------+----------+------+------+
| 00001  | NULL     | test | NULL |
+--------+----------+------+------+
1 row in set (0.00 sec)

INSERT INTO SELECT:別の表からINSERT

INSERT文では、別の表のレコードをSELECTした結果を、任意の表へ登録することが出来ます。

テーブルをまるまるコピーする場合はCREATE TABLE~AS文を使います。

INSERT INTO 表名 SELECT文;

次の例では、tab1_bkテーブルからtab1テーブルにレコードを全件登録しています。

mysql> INSERT INTO tab1 SELECT * FROM tab1_bk;
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tab1;
+--------+----------+-------+------+
| emp_id | emp_name | dept  | age  |
+--------+----------+-------+------+
| 00001  | Suzuki   | D0001 |   28 |
| 00002  | Tanaka   | D0002 |   25 |
| 00003  | Kizaki   | D0002 |   35 |
| 00004  | Tanaka   | D0003 |   45 |
| 00005  | Kizaki   | D0003 |   55 |
| 00006  | Nakata   | D0003 |   35 |
+--------+----------+-------+------+
6 rows in set (0.00 sec)

通常のINSERTと同様に値を省略することもできます。

次の例ではemp_id列以外を省略しています。省略した場合はデフォルト値(設定がない場合はNULL値)が登録されています。

mysql> INSERT INTO tab1(emp_id) SELECT emp_id FROM tab1_bk;
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tab1;
+--------+----------+------+------+
| emp_id | emp_name | dept | age  |
+--------+----------+------+------+
| 00001  | NULL     | NULL | NULL |
| 00002  | NULL     | NULL | NULL |
| 00003  | NULL     | NULL | NULL |
| 00004  | NULL     | NULL | NULL |
| 00005  | NULL     | NULL | NULL |
| 00006  | NULL     | NULL | NULL |
+--------+----------+------+------+
6 rows in set (0.00 sec)

真偽値(0,1)の登録

真偽値を0または1で登録するにはBIT型を使います。

次のSQLでは、COL2列をBIT型(1桁)で宣言しています。

CREATE TABLE tab1(
 col1 varchar(10)
 ,col2 bit(1)
 );

実際にデータを登録してみます。

mysql> INSERT INTO tab1 VALUES('00001',0);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO tab1 VALUES('00002',1);
Query OK, 1 row affected (0.01 sec)

データはバイナリー型の文字列として登録されます。

mysql> SELECT col1,bin(col2) FROM tab1;
+-------+-----------+
| col1  | bin(col2) |
+-------+-----------+
| 00001 | 0         |
| 00002 | 1         |
+-------+-----------+

ミリ秒の登録

ミリ秒を登録するには、登録したい列に少数桁の設定をしておきます。

次のSQLではtab1テーブルのCOL2列に少数3桁(ミリ秒)を設定しています。マイクロ秒の場合は6を設定します。

CREATE TABLE tab1(
 col1 varchar(10)
 ,col2 TIMESTAMP(3)
 );

ミリ秒のデータを登録するときも同様に少数設定をしたTIMESTAMPを登録します。

INSERT INTO tab1 VALUES('00001',CURRENT_TIMESTAMP(3));

登録したデータをSELECTすると、ミリ秒が表示されます。

mysql> SELECT col1,col2 FROM tab1;
+-------+-------------------------+
| col1  | col2                    |
+-------+-------------------------+
| 00001 | 2010-10-10 10:10:34.704 |
+-------+-------------------------+
1 row in set (0.00 sec)