MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

【MySQL】異なるデータベース間で列構成が異なる2つのテーブル間をデータ移動する方法

INSERT SELECTステートメントでデータベース間のデータ移動を実現

異なるデータベース間で、しかも列構成が異なるテーブル同士の間でデータを移動したい場合は、「INSERT ... SELECT」ステートメントを使用します。データベース名.テーブル名 の形式で対象を指定できるため、データベースをまたいだコピーが可能です。基本の構文は以下のとおりです。

INSERT INTO
yourDatabaseName1.yourTableName1(yourColumnName1,yourColumnName2,....N)
SELECT yourColumnName1,yourColumnName2,....N FROM
yourdatabaseName2.yourTableName2;

ここからは、次の2つのデータベースを使って具体的な手順を解説します。

  • sample(受信側)
  • test(送信側)

手順1:「test」データベースに送信側テーブルを作成する

まず「test」データベースに接続し、送信側となるテーブル「send」を作成します。

mysql> use test;
Database changed
mysql> create table send
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Name varchar(20)
    -> );
Query OK, 0 rows affected (1.19 sec)

手順2:INSERTコマンドでレコードを追加する

作成したテーブルに、INSERTコマンドでいくつかのレコードを追加します。

mysql> insert into send(Name) values('John');
Query OK, 1 row affected (0.20 sec)
mysql> insert into send(Name) values('Carol');
Query OK, 1 row affected (0.40 sec)

SELECT文ですべてのレコードを表示して確認してみましょう。

mysql> select *from send;

実行結果は以下のとおりです。

+----+-------+
| Id | Name  |
+----+-------+
| 1  | John  |
| 2  | Carol |
+----+-------+
2 rows in set (0.00 sec)

手順3:「sample」データベースに受信側テーブルを作成する

続いて「sample」データベースに切り替え、受信側となるテーブル「receive」を作成します。このとき、列名や構成が「send」テーブルとは異なっている点に注目してください。

mysql> use sample;
Database changed
mysql> create table receive
    -> (
    -> UserId int,
    -> UserName varchar(20)
    -> );
Query OK, 0 rows affected (0.59 sec)

ご覧のとおり、現時点で「receive」テーブルにはまだレコードが1件も登録されていません。

手順4:異なるデータベース間でデータを移動する

それでは、列構成の異なる2つのテーブル間で、別々のデータベースをまたいでデータを移動してみましょう。実行するクエリは以下のとおりです。

mysql> insert into sample.receive(UserId,UserName)
    -> select Id,Name from test.send;
Query OK, 2 rows affected (0.21 sec)
Records: 2 Duplicates: 0 Warnings: 0

ここでのポイントは、「send」テーブルの「Id」列と「Name」列の値を、それぞれ「receive」テーブルの「UserId」列と「UserName」列に対応付けて挿入している点です。INSERT INTO句とSELECT句で列を正しく並べることで、列名が異なるテーブル間でも柔軟にデータをコピーできます。

最後に「sample.receive」テーブルの全レコードを表示して結果を確認します。

mysql> select *from receive;

以下の出力から、異なるデータベース間のテーブル同士でデータが正常に移動できたことがわかります。

+--------+----------+
| UserId | UserName |
+--------+----------+
| 1      | John     |
| 2      | Carol    |
+--------+----------+
2 rows in set (0.00 sec)

まとめ

異なるMySQLデータベース間で列構成の異なるテーブル同士のデータ移動は、「INSERT INTO ... SELECT」ステートメントを使えばシンプルに実現できます。「データベース名.テーブル名」の形式で指定できるほか、SELECT句で取得する列の順序を調整することで、列名や列数が異なるテーブルにもそのまま対応可能です。サーバー内のデータ移行や集計処理などで活用場面が多いため、ぜひ覚えておきましょう。

  1. MySQLのUNIONとORDER BYを使って、異なる2つのテーブルから2つの列を表示・ソートする方法

    MySQLでは、UNIONとORDER BY句を組み合わせることで、異なる2つのテーブルから取得した列を1つの結果セットとしてまとめて表示し、並べ替えることができます。この記事では、実際のサンプルコードと実行結果をもとに、その手順をわかりやすく解説します。 手順1:1つ目のテーブルを作成する まず、Amount(金額)列を持つテーブル「DemoTable1」を作成します。 mysql> create table DemoTable1 ( Amount int ); Query OK, 0 rows affected (0.63 sec) 手順2:DemoTable1にデータを挿入

  2. MySQLでテーブルのデータを削除した後にAUTO_INCREMENTを1から再開させる方法

    MySQLでデータ削除後にAUTO_INCREMENTを1に戻す方法MySQLでは、DELETE文でレコードを削除してもAUTO_INCREMENTの値はリセットされず、次に挿入されるレコードには続きの番号が割り当てられます。自動インクリメントの値を1に戻したい場合は、TRUNCATE TABLEコマンドを使用します。本記事では、実際のSQL例を使ってその動作を確認していきます。検証用テーブルの作成まず、テーブルを作成します。mysql> create table DemoTable1796 ( StudentId int NOT NULL AUTO_INCREMENT