別テーブルの内容を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するもとのテーブルを【旧テーブル】としています。