MySQLでテーブルにデータを追加する(INSERT)

MySQL MySQL

MySQLでテーブルにデータを追加する方法について書いています。
作成したデータベースのテーブルにデータを追加するには、テーブルに対してINSERT INTOを使うと良いです。

MySQLのバージョン8.0.32で、動作を検証しています。

INSERTについての公式のページはこちらにあります。

テーブルにデータを追加する

MySQLでテーブルにデータを追加するにはINSERT INTOを使います。
例えば、下記のようにデータを追加するためのSQLを書くことができます。

INSERT INTO users (name, age, birthday) VALUE ('taro', '25', '1998-01-01');

このSQLを実行すると、usersテーブルに対して、データが追加されます。
(usersテーブルは、こちらの記事で作成したテーブルです)

追加されるデータは、VALUEの後に書いている内容です。
「name」カラムに「taro」・「age」カラムに「25」・「birthday」カラムに「1998-01-01」が当てはめられて、データが1行追加されます。

追加した後に、テーブルを確認すると、下記のように1行追加されていることが確認できました。

mysql> SELECT * FROM users;
+----+------+------+------------+
| id | name | age  | birthday   |
+----+------+------+------------+
|  1 | taro |   25 | 1998-01-01 |
+----+------+------+------------+
1 row in set (0.00 sec)

idの列は自動採番(AUTO_INCRIMENT)を指定しているので、特にデータを当てはめなくても追加できています。

INSERT文をわかりやすくまとめると

INSERT文をわかりやすくで書くと、下記のようになります。

INSERT INTO テーブル名 (カラム1, カラム2, カラム3 ... ) VALUE (値1, 値2, 値3 ... );

カラムと値が対応しています。

「カラム1」の箇所に「値1」が入って、「カラム2」の箇所に「値2」が入って… といった形です。
カラムの間はカンマ(,)で区切って、値の間もカンマ(,)で区切る必要があります。

テーブルにカラムがあるだけ、記述していくことができます。
また、NULL許可されているカラムや、AUTO_INCRIMENTのカラムは省くことができます。

INTOは省略することができる

INSERT INTOのINTOは省略して書くこともできます。
例えば、先ほどのINSERT文は下記のように省略して書けます。

INSERT users (name, age, birthday) VALUE ('taro', '25', '1998-01-01');

実行すると、同じように1行データが追加されます。

テーブルに複数データを追加する

INSERT文で複数のデータを一括で、登録したい時にはVALUEVALUESにして、複数の値を定義した内容を並べます。
例えば、下記のように指定することができます。

INSERT INTO users (name, age, birthday) 
  VALUES ('taro', '25', '1998-01-01'), 
       ('jiro', '23', '2000-01-01'), 
       ('yasuaki', '34', '1989-02-06');

usersテーブルを指定した後に、それぞれ値を当てはめるカラムを指定しています。

その後にVALUESを書いて、丸括弧でカラムに対応する値を並べています。
3つ定義しました。それぞれの定義もカンマ(,)で区切る必要があります。

これを実行すると、usersテーブルに対して、3行追加されます。
実行した後に確認すると、下記のように行が追加されたのが確認できました。

mysql> SELECT * FROM users;
+----+---------+------+------------+
| id | name    | age  | birthday   |
+----+---------+------+------------+
|  1 | taro    |   25 | 1998-01-01 |
|  2 | jiro    |   23 | 2000-01-01 |
|  3 | yasuaki |   34 | 1989-02-06 |
+----+---------+------+------------+
3 rows in set (0.00 sec)

テーブルにデータ追加時に重複エラーが出る

テーブルにデータ追加時に重複エラーが出る場合は、主キーまたはユニークなカラムに同じ値を入れていないか確認しましょう。

主キーに同じ値を入れようとするとエラー

主キーの値はユニーク(一意になる値)です。
値が同じものを入れようとすると、エラーになります。

例えば、先ほどのusersテーブルには、idが1から3までのデータが入っています。
これに対して、下記のようにidを指定してデータを入れようとします…

INSERT INTO users (id, name, age, birthday) VALUE (1, 'taro', '25', '1998-01-01');

すると、下記のようにERROR 1062 (23000)エラーが発生します。

ERROR 1062 (23000): Duplicate entry '1' for key 'users.PRIMARY'

idとして指定した、値の「1」が重複していると出ています。
主キーには重複しない値を入れる必要があります。

ユニークなカラムに同じ値を入れようとするとエラー

ユニークなカラムにも、同じ値を入れようとするとエラーが発生します。
ユニークなカラムはテーブル作成時にUNIQUEが付けられているカラムです。

例えば、先ほどのusersテーブルのnameカラムにUNIQUE設定がされているとします。
既に、下記のように1行データがある時です。

mysql> SELECT * FROM users;
+----+------+------+------------+
| id | name | age  | birthday   |
+----+------+------+------------+
|  1 | taro |   25 | 1998-01-01 |
+----+------+------+------------+
1 row in set (0.00 sec)

このときに、同じ名前の値を指定して追加しようとします…

INSERT INTO users (name, age, birthday) VALUE ('taro', '25', '1998-01-01');

そうすると、下記のようにERROR 1062 (23000)が発生します。

ERROR 1062 (23000): Duplicate entry 'taro' for key 'users.name'

ユニークなカラムにも同じ値を入れないようにしましょう。

他のテーブルからデータを追加する(INSERT SELECT)

他のテーブルからデータを追加する時には、INSERT文を作ってVALUEの箇所をSELECTにします。
例えば、user_temporariesというテーブルが下記のように定義されています。(usersテーブルと同じ構造です)

CREATE TABLE user_temporaries (
  id BIGINT NOT NULL AUTO_INCREMENT,
  name VARCHAR(128),
  age SMALLINT,
  birthday DATE,
  PRIMARY KEY (id)
);

この時にusersテーブルは下記のように、データが空です。

mysql> SELECT * FROM users; 
Empty set (0.00 sec)

そして、user_temporariesテーブルにデータが3件入っています。

mysql> SELECT * FROM user_temporaries;
+----+--------+------+------------+
| id | name   | age  | birthday   |
+----+--------+------+------------+
|  1 | taro   |   25 | 1998-01-01 |
|  2 | jiro   |   23 | 2000-01-01 |
|  3 | hanako |   30 | 1993-01-01 |
+----+--------+------+------------+
3 rows in set (0.00 sec)

この状態で、下記のSQLを実行すると、user_temporariesテーブルをSELECTした結果をusersテーブルにインサートできます。

INSERT INTO users SELECT * FROM user_temporaries;

usersテーブルに対して、user_temporariesテーブルを取得した結果を入れています。
また、データを当てはめるカラムを指定することもできます。

INSERT INTO users (name, age, birthday) SELECT name, age, birthday FROM user_temporaries WHERE id = 1;

name・age・birthday」のそれぞれのカラムに、SELECTで取得した「name・age・birthday」の値を入れてインサートしています。
WHEREでidが「1」のデータのみを取得して、返しています。

2つのSQLを実行すると、下記のような結果になりました。

mysql> SELECT * FROM users;
+----+--------+------+------------+
| id | name   | age  | birthday   |
+----+--------+------+------------+
|  1 | taro   |   25 | 1998-01-01 |
|  2 | jiro   |   23 | 2000-01-01 |
|  3 | hanako |   30 | 1993-01-01 |
|  4 | taro   |   25 | 1998-01-01 |
+----+--------+------+------------+
4 rows in set (0.00 sec)

user_temporariesテーブルから取得したデータをインサートできました。

テーブルにデータを追加する方法まとめ

今回はMySQLでテーブルにデータを追加する方法を書きました。
記事の内容をまとめると、下記のようになります。

・「`INSERT INTO テーブル名 (カラム…) VALUE (値…)`」でテーブルにデータを追加することができる。
・「`INSERT INTO テーブル名 (カラム…) VALUES (値…), (値…)`」でテーブルに複数のデータを追加することができる。
・主キーやユニークなカラムには、既に入っている内容と同じ値は入れることができない。
・「`INSERT INTO テーブル名 SELECT * FROM テーブル名`」で他のテーブルを使ってインサートできた。

コメント

タイトルとURLをコピーしました