MySQLで一致するIDを基に、あるテーブルから別のテーブルへ列の値をコピーする方法
MySQLでは、UPDATE文と複数テーブルの結合条件を組み合わせることで、あるテーブルの列の値を、IDが一致する別のテーブルへ簡単にコピーできます。この記事では、実際のサンプルコードとともに手順を詳しく解説します。
1. 最初のテーブルを作成する
まず、コピー元となるテーブル「DemoTable1」を作成します。
mysql> create table DemoTable1
(
PersonId int,
Value int
);
Query OK, 0 rows affected (0.64 sec)2. テーブルにレコードを挿入する
INSERT文を使って、いくつかのレコードを追加します。
mysql> insert into DemoTable1 values(100,78); Query OK, 1 row affected (0.46 sec) mysql> insert into DemoTable1 values(101,67); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable1 values(102,89); Query OK, 1 row affected (0.19 sec)
3. レコードを確認する
SELECT文で全レコードを表示して確認しましょう。
mysql> select *from DemoTable1;
実行結果は以下の通りです。
+----------+-------+ | PersonId | Value | +----------+-------+ | 100 | 78 | | 101 | 67 | | 102 | 89 | +----------+-------+ 3 rows in set (0.00 sec)
4. 2つ目のテーブルを作成する
次に、コピー先となるテーブル「DemoTable2」を作成します。
mysql> create table DemoTable2
(
StudentId int,
StudentScore int
);
Query OK, 0 rows affected (0.57 sec)ここでもINSERT文でレコードを追加します。StudentScore列にはNULLを設定しておきます。
mysql> insert into DemoTable2 values(100,NULL) ; Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable2 values(102,NULL); Query OK, 1 row affected (0.22 sec)
SELECT文で確認すると、以下のようにNULLが含まれた状態になっています。
+-----------+--------------+ | StudentId | StudentScore | +-----------+--------------+ | 100 | NULL | | 102 | NULL | +-----------+--------------+ 2 rows in set (0.00 sec)
5. 一致するIDを基に列の値をコピーする
いよいよ本題です。次のクエリを実行すると、DemoTable2.StudentId と DemoTable1.PersonId が一致する行に対して、DemoTable1.Value の値が DemoTable2.StudentScore へコピーされます。
mysql> update DemoTable1, DemoTable2 set DemoTable2.StudentScore = DemoTable1.Value where DemoTable2.StudentId=DemoTable1.PersonId; Query OK, 2 rows affected (0.13 sec) Rows matched: 2 Changed: 2 Warnings: 0
ポイント解説
- UPDATE文の後ろにカンマ区切りで複数のテーブル名を指定することで、複数テーブルを同時に扱えます(マルチテーブルUPDATE)。
- WHERE句で両テーブルのID列を結合条件として指定し、一致する行のみを更新対象にしています。
- DemoTable1のPersonId=101はDemoTable2に存在しないため、更新の対象外となります。
6. 更新結果を確認する
もう一度SELECT文を実行して、テーブルの中身を確認してみましょう。
mysql> select *from DemoTable2;
実行結果は以下の通りです。NULLだった StudentScore 列に、一致するIDの Value の値が正しくコピーされていることがわかります。
+-----------+--------------+ | StudentId | StudentScore | +-----------+--------------+ | 100 | 78 | | 102 | 89 | +-----------+--------------+ 2 rows in set (0.00 sec)
まとめ
このように、MySQLのマルチテーブルUPDATE構文を使えば、JOINのような感覚で、あるテーブルの列の値を別のテーブルの一致するIDの行へ効率的にコピーできます。大量データの一括更新にも対応できるため、実務でも頻繁に使われるテクニックですので、ぜひ覚えておきましょう。
-
MySQLのINSERT INTO SELECT文で別のテーブルの値を挿入する方法
あるテーブルの値を基に別のテーブルへデータを挿入したい場合は、INSERT INTO SELECT文を使用します。この構文では、SELECT文で抽出した結果セットをそのまま対象テーブルへ流し込めるため、テーブル間のデータ移行やコピーにもっとも効率的な方法の一つです。 以下の手順で、実際の動作を順番に確認していきましょう。 手順1:元となるテーブルを作成する まず、データのコピー元となるテーブル「demo82」を作成します。 mysql> create table demo82 -> (
-
MySQLであるテーブルから別のテーブルへデータを挿入する方法(INSERT INTO SELECT)
MySQLであるテーブルから別のテーブルへデータをコピーして挿入したい場合は、INSERT INTO ... SELECT 文を使用します。この記事では、実際にテーブルを作成し、データを別テーブルへ移す手順をサンプルコードと実行結果とともにわかりやすく解説します。 1. 元となるテーブルを作成する まず、コピー元となるテーブル「DemoTable1」を作成します。カラムは Id(int型)と FirstName(varchar型)の2つです。 mysql> create table DemoTable1 -> ( -> Id int, -> Fi