MySQL の insert ... select で、insert 先のテーブルに存在しないレコードを登録する方法のメモ。
■登録元テーブル(test_id_val1)
実行後のテーブルの登録内容は以下の通り。
■登録先テーブル(test_insert1)
実行後のテーブルの登録内容は以下の通り。
■登録元テーブル(test_id_val1)の id を登録先テーブル(test_insert1)に登録
上記の insert ... select によって test_insert1 に登録されていなかった id_04 ~ id_06 が登録されまています。
■登録元テーブル(test_id_val1)
create table test_id_val1 ( id varchar(32) not null, val varchar(32) not null, primary key (id) ); insert into test_id_val1 (id, val) values ('id_01', 'val_01') , ('id_02', 'val_02') , ('id_03', 'val_03') , ('id_04', 'val_04') , ('id_05', 'val_05') , ('id_06', 'val_06') ;
実行後のテーブルの登録内容は以下の通り。
mysql> select * from test_id_val1; +-------+--------+ | id | val | +-------+--------+ | id_01 | val_01 | | id_02 | val_02 | | id_03 | val_03 | | id_04 | val_04 | | id_05 | val_05 | | id_06 | val_06 | +-------+--------+
■登録先テーブル(test_insert1)
create table test_insert1 ( id varchar(32) not null, id_rev varchar(32) default null, primary key (id), index (id_rev) ); insert into test_insert1 (id) values ('id_01'), ('id_02'), ('id_03') ; update test_insert1 set id_rev = reverse(id) where id_rev is null ;
実行後のテーブルの登録内容は以下の通り。
mysql> select * from test_insert1; +-------+--------+ | id | id_rev | +-------+--------+ | id_01 | 10_di | | id_02 | 20_di | | id_03 | 30_di | +-------+--------+
■登録元テーブル(test_id_val1)の id を登録先テーブル(test_insert1)に登録
insert ignore into test_insert1 (id, id_rev) select t1.id , reverse(t1.id) from test_id_val1 as t1 left join test_insert1 t2 on t2.id = t1.id where t2.id is null ;
上記の insert ... select によって test_insert1 に登録されていなかった id_04 ~ id_06 が登録されまています。
mysql> select * from test_insert1; +-------+--------+ | id | id_rev | +-------+--------+ | id_01 | 10_di | | id_02 | 20_di | | id_03 | 30_di | | id_04 | 40_di | | id_05 | 50_di | | id_06 | 60_di | +-------+--------+