【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句で取得する列の順序を調整することで、列名や列数が異なるテーブルにもそのまま対応可能です。サーバー内のデータ移行や集計処理などで活用場面が多いため、ぜひ覚えておきましょう。
-
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にデータを挿入
-
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