dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

MySQL の insert ... select で未登録のレコードを登録

2023-10-26 00:24:11 | mysql
MySQL の insert ... select で、insert 先のテーブルに存在しないレコードを登録する方法のメモ。

■登録元テーブル(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  |
+-------+--------+