MySQLでテーブルAとBを比較し、Bに存在しないデータをテーブルCに挿入する方法
MySQL:テーブルAとBを比較し、Bに存在しないデータをCへ挿入する方法
テーブルAのデータとテーブルBを比較し、Bに存在しないレコードだけをテーブルCに挿入したい場合は、LEFT JOIN(左外部結合)を使うのが最もシンプルで確実な方法です。ここでは、3つのテーブル(demo20=テーブルA、demo21=テーブルB、demo22=テーブルC)を使って、具体的な手順を順番に解説します。
ステップ1:テーブルA(demo20)を作成する
まず、比較元となる最初のテーブルを作成します。
mysql> create table demo20 −> ( −> id int, −> name varchar(20) −> ); Query OK, 0 rows affected (1.87 sec)
続いて、insertコマンドでレコードを挿入します。
mysql> insert into demo20 values(100,'John'); Query OK, 1 row affected (0.07 sec) mysql> insert into demo20 values(101,'Bob'); Query OK, 1 row affected (0.24 sec) mysql> insert into demo20 values(102,'Mike'); Query OK, 1 row affected (0.12 sec) mysql> insert into demo20 values(103,'Carol'); Query OK, 1 row affected (0.15 sec)
select文でテーブルの内容を確認してみましょう。
mysql> select *from demo20;
実行すると、次のような出力が得られます。
+------+-------+ | id | name | +------+-------+ | 100 | John | | 101 | Bob | | 102 | Mike | | 103 | Carol | +------+-------+ 4 rows in set (0.00 sec)
ステップ2:テーブルB(demo21)を作成する
次に、比較先となる2つ目のテーブルを作成します。
mysql> create table demo21 −> ( −> id int, −> name varchar(20) −> ); Query OK, 0 rows affected (1.70 sec)
同様に、insertコマンドでレコードを挿入します。
mysql> insert into demo21 values(100,'Sam'); Query OK, 1 row affected (0.12 sec) mysql> insert into demo21 values(101,'Adam'); Query OK, 1 row affected (0.14 sec) mysql> insert into demo21 values(133,'Bob'); Query OK, 1 row affected (0.13 sec) mysql> insert into demo21 values(145,'David'); Query OK, 1 row affected (0.15 sec)
select文で内容を確認します。
mysql> select *from demo21;
実行結果は以下の通りです。
+------+-------+ | id | name | +------+-------+ | 100 | Sam | | 101 | Adam | | 133 | Bob | | 145 | David | +------+-------+ 4 rows in set (0.00 sec)
ステップ3:テーブルC(demo22)を作成する
最後に、データの挿入先となる3つ目のテーブルを作成します。
mysql> create table demo22 −> ( −> id int, −> name varchar(20) −> ); Query OK, 0 rows affected (1.39 sec)
ステップ4:Bに存在しないAのデータをCへ挿入する
ここからが本題です。demo20をテーブルA、demo21をテーブルB、demo22をテーブルCと見立てます。テーブルAには存在するものの、テーブルBには存在しないデータだけをCに挿入するクエリは、次のように記述します。
mysql> insert into demo22(id,name) −> select tbl1.id,tbl1.name from demo20 tbl1 −> left join demo21 tbl2 on tbl2.id=tbl1.id −> where tbl2.id is null; Query OK, 2 rows affected (0.21 sec) Records: 2 Duplicates: 0 Warnings: 0
このクエリのポイントは、「where tbl2.id is null」という条件です。LEFT JOINでは、結合相手となるテーブルB側にマッチする行が存在しない場合、その列の値がNULLになります。つまり、このNULLを条件にすることで、「テーブルAにはあるがテーブルBにはないレコード」だけを正確に抽出できるのです。
実行結果の確認
select文でテーブルCの内容を確認してみましょう。
mysql> select *from demo22;
実行すると、次の出力が得られます。
+------+-------+ | id | name | +------+-------+ | 102 | Mike | | 103 | Carol | +------+-------+ 2 rows in set (0.00 sec)
ご覧の通り、テーブルA(demo20)には存在するものの、テーブルB(demo21)には存在しなかったid=102(Mike)とid=103(Carol)の2件だけが、テーブルC(demo22)に挿入されました。この手法は、差分データの抽出や同期処理など、さまざまな場面で応用できる便利なテクニックです。
-
JavaでMySQLデータベースにデータを挿入する方法をわかりやすく解説
JavaからMySQLデータベースにデータを挿入するには、SQLのINSERTコマンドを使用します。基本的な構文は以下の通りです。 INSERT INTO テーブル名(カラム名1, カラム名2, ......カラム名N) VALUES(値1, 値2, ......値N); ここからは、Javaプログラムを使って実際にMySQLデータベースへレコードを挿入する手順を、順を追って見ていきましょう。 ステップ1:MySQLでテーブルを作成する まず、データの挿入先となるテーブルをMySQL側に作成します。以下のクエリを実行してください。 mysql> create table Insert
-
MySQLのテーブルデータはWindowsのどこに保存される?確認方法をわかりやすく解説
MySQLテーブルデータの保存場所を確認する方法MySQLで作成したテーブルのデータが、実際にWindows上のどの場所に保存されているのかを知りたいケースはよくあります。そんなときは、システム変数「datadir」を確認することで、データディレクトリの場所を簡単に把握できます。まずは、最もシンプルな方法として「@@datadir」を参照する構文を見てみましょう。select @@datadir;また、SHOW VARIABLESコマンドを使って確認することもできます。その場合の構文は以下の通りです。show variables where Variable_name = datadir;実際