MySQLで異なる列を持つ別テーブルへレコードをコピーする方法(INSERT INTO SELECT活用)
あるテーブルから、列名や構成が異なる別のテーブルへレコードをコピーしたい場合、INSERT INTO SELECT 文を使用します。この記事では、実際にサンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。
ステップ1:コピー元のテーブルを作成する
まずはコピー元となるテーブル「DemoTable1900」を作成します。ClientIdは自動採番(AUTO_INCREMENT)とし、初期値を1000に設定しています。また、ClientAgeにはデフォルト値29を設定しました。
mysql> create table DemoTable1900
(
ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
ClientName varchar(20),
ClientAge int default 29
) auto_increment=1000;
Query OK, 0 rows affected (0.00 sec)
ステップ2:テーブルにサンプルデータを挿入する
INSERTコマンドを使って、いくつかのレコードを挿入します。最後の「Sam」のように年齢を指定しない場合、デフォルト値の29が自動的に設定される点に注目してください。
mysql> insert into DemoTable1900(ClientName,ClientAge) values('Chris',45);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1900(ClientName,ClientAge) values('David',29);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1900(ClientName,ClientAge) values('Mike',37);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1900(ClientName) values('Sam');
Query OK, 1 row affected (0.00 sec)
SELECT文ですべてのレコードを確認してみましょう。
mysql> select * from DemoTable1900;
実行結果は以下のとおりです。
+----------+------------+-----------+ | ClientId | ClientName | ClientAge | +----------+------------+-----------+ | 1000 | Chris | 45 | | 1001 | David | 29 | | 1002 | Mike | 37 | | 1003 | Sam | 29 | +----------+------------+-----------+ 4 rows in set (0.00 sec)
ステップ3:コピー先のテーブルを作成する
次に、コピー先となるテーブル「DemoTable1901」を作成します。このテーブルは元テーブルとは異なる列名(EmployeeId、EmployeeName、EmployeeAge)を持っている点がポイントです。
mysql> create table DemoTable1901
(
EmployeeId int,
EmployeeName varchar(20),
EmployeeAge int
);
Query OK, 0 rows affected (0.00 sec)
ステップ4:INSERT INTO SELECTでレコードをコピーする
いよいよ本題です。INSERT INTO SELECT文を使えば、列名が異なるテーブル間でも、対応する列を明示的に指定することでデータをコピーできます。
mysql> insert into DemoTable1901(EmployeeId,EmployeeName,EmployeeAge)
select ClientId,ClientName,
ClientAge from DemoTable1900;
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
このクエリでは、「DemoTable1900」のClientId→EmployeeId、ClientName→EmployeeName、ClientAge→EmployeeAgeというように、列同士の対応関係を指定してコピーを行っています。
SELECT文でコピー結果を確認しましょう。
mysql> select * from DemoTable1901;
実行結果は以下のとおりです。元テーブルのデータが、異なる列名のテーブルへ正しくコピーされていることがわかります。
+------------+--------------+-------------+ | EmployeeId | EmployeeName | EmployeeAge | +------------+--------------+-------------+ | 1000 | Chris | 45 | | 1001 | David | 29 | | 1002 | Mike | 37 | | 1003 | Sam | 29 | +------------+--------------+-------------+ 4 rows in set (0.00 sec)
まとめ
列構成が異なるテーブル間でデータをコピーする場合は、INSERT INTO SELECT文が便利です。INSERT側でコピー先の列名を、SELECT側でコピー元の列名をそれぞれ指定することで、柔軟にデータ移行やバックアップ処理を実現できます。WHERE句を組み合わせれば、特定の条件に合うレコードだけをコピーすることも可能なので、ぜひ活用してみてください。
-
MySQLでハイフン区切りの文字列値を1つの列から複数の列に分離して選択する方法
ハイフンで区切られた文字列値を1つの列から複数の列に分離して取得したい場合、MySQLの SUBSTRING_INDEX() 関数を使用すると簡単に実現できます。ここでは、サンプルテーブルを使って具体的な手順を解説します。 サンプルテーブルの作成 まず、従業員情報を格納するテーブルを作成します。 mysql> create table DemoTable1962 ( EmployeeInformation text ); Query OK, 0 rows affected (0.00 sec) データの挿入 次に、INSERT文を使って「ID-名前-年齢」の形
-
【MySQL】別のテーブルのデータを参照してテーブルを更新する方法(UPDATE+JOIN)
MySQLでは、UPDATEコマンドとJOINを組み合わせることで、別のテーブルのデータを参照しながら、対象のテーブルを効率的に更新できます。本記事では、2つのテーブルを使った具体的なサンプルを通じて、その手順をわかりやすく解説します。 手順1:参照元のテーブルを作成する まず、氏名データを保持する1つ目のテーブル「demo54」を作成します。 mysql> create table demo54-> (-> firstName varchar(20),-> lastName varchar(20)-> );Query OK, 0 rows affected (