MariaDB:別テーブルの内容をinsertするSQL構文と例

別テーブルの内容をinsertするシチュエーション

例えばもとのテーブルの内容をそのまま保持しておいて、新しくテーブルを作成したい場合や、
既存のテーブルのカラムを別テーブルに移動する場合など、レコードをごそっと別テーブルに移動する際に使用します。
移動後のテーブルが新規テーブルであれば、既存のテーブルをコピーしてから不要なカラムを削除するという方法もありますが、今回はもとのテーブルの必要なカラムの情報だけ新しいテーブルにinsertする方法をみていきます。

別テーブルの内容をinsertする具体例

それでは具体的にテーブルを作成していきましょう。
まずは今回サンプルで使う「users」テーブルを作成します。
「users」テーブルにはいくつかレコードを登録しておきます。

create table users(
    id int primary key auto_increment,
    first_name text not null,
    last_name text not null,
    admin_flag bool
);
insert into users(first_name,last_name,admin_flag) values('ichii','taro',true);
insert into users(first_name,last_name,admin_flag) values('nikai','jiro',false);
insert into users(first_name,last_name,admin_flag) values('mikami','saburo',false);
insert into users(first_name,last_name,admin_flag) values('shishido','shiro',false);
insert into users(first_name,last_name,admin_flag) values('goto','goro',false);

こんな感じでデータが登録されます。

select * from users;
+----+------------+-----------+------------+
| id | first_name | last_name | admin_flag |
+----+------------+-----------+------------+
|  1 | ichii      | taro      |          1 |
|  2 | nikai      | jiro      |          0 |
|  3 | mikami     | saburo    |          0 |
|  4 | shishido   | shiro     |          0 |
|  5 | goto       | goro      |          0 |
+----+------------+-----------+------------+

ではこのusersのうち、admin_flagがtrueであるレコードのデータをadmin_usersテーブルにinsertしてみましょう。

admin_usersテーブルを作成しておきます。

create table admin_users(
    id int primary key auto_increment,
    first_name text not null,
    last_name text not null
);

レコードはinsertしていないので中身はからの状態です。

select * from admin_users;
Empty set (0.001 sec)

ではここで以下のSQLを実行します。

insert into admin_users(first_name,last_name) select first_name,last_name from users where admin_flag=true;

admin_usersテーブルをみてみると、admin_flagがtrueだったレコードがinsertされているのがわかります。

select * from admin_users;
+----+------------+-----------+
| id | first_name | last_name |
+----+------------+-----------+
|  1 | ichii      | taro      |
+----+------------+-----------+

次の例をみてみましょう。以下のようなnew_usersテーブルにusersの情報をコピーしたいとします。

create table new_users(
    id int primary key auto_increment,
    name text not null
);

その時nameカラムにfirst_nameとlast_nameを結合した値を入れるとします。
また、admin_flagがfalseのレコードに絞っています。
この場合は以下のようなSQLになります。

insert into new_users(name) select concat(first_name,last_name) from users where admin_flag=false;

new_usersテーブルにinsertされていることがわかります。

select * from new_users;
+----+---------------+
| id | name          |
+----+---------------+
|  1 | nikaijiro     |
|  2 | mikamisaburo  |
|  3 | shishidoshiro |
|  4 | gotogoro      |
+----+---------------+

このように複数カラムの内容を結合したいときには「concat」を使う、ということも覚えておきましょう。
今回のようなケースでよく使います。

まとめ「別テーブルの内容をinsertするSQL」の構文

最後に構文をまとめておきます。

insert into 【新テーブル名】 (【カラム名(複数の場合はカンマ区切り)】) select 【カラム名(複数の場合はカンマ区切り)】 from 【旧テーブル名】 where 【旧テーブルの絞り込み条件】;

※insert先のテーブルを【新テーブル】、insertするもとのテーブルを【旧テーブル】としています。