MySQL INSERT INTO SELECT 文
1. MySQL INSERT INTO SELECT の概要
INSERT INTO SELECT 文は、既存のテーブルからデータをコピーし、それを別の既存テーブルに挿入するために使用されます。
このステートメントを使用する際の重要な要件として、移行元(ソース)と移行先(ターゲット)のテーブル間でデータ型が一致している必要があります。
注: ターゲットテーブルにすでに存在する既存のレコードは、この操作によって影響を受けることはありません(上書きされず、末尾に追加されます)。
2. INSERT INTO SELECT の基本構文
2.1 すべてのカラムをコピーする場合
あるテーブルから別のテーブルへ、すべてのカラムをそのままコピーする際の記述です:
INSERT INTO ターゲットテーブル
SELECT * FROM ソーステーブル
WHERE 条件; 重要: カラム名を省略して SELECT * を使用する場合、ソーステーブルとターゲットテーブルのカラム数および並び順が完全に一致している必要があります。
2.2 特定のカラムのみをコピーする場合
必要なカラムだけを選択して移行する、より実務的な記述です:
INSERT INTO ターゲットテーブル (カラム1, カラム2, カラム3, ...)
SELECT カラム1, カラム2, カラム3, ...
FROM ソーステーブル
WHERE 条件;3. デモ用データベース
以下は、Northwind サンプルデータベースの「Customers(顧客)」テーブルからの抜粋です:
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
次に、「Suppliers(仕入先)」テーブルの抜粋です:
| SupplierID | SupplierName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Exotic Liquid | Charlotte Cooper | 49 Gilbert St. | London | EC1 4SD | UK |
| 2 | New Orleans Cajun Delights | Shelley Burke | P.O. Box 78934 | New Orleans | 70117 | USA |
| 3 | Grandma Kelly's Homestead | Regina Murphy | 707 Oxford Rd. | Ann Arbor | 48104 | USA |
4. MySQL INSERT INTO SELECT の使用例
4.1 「Suppliers」を「Customers」へコピーする
一部のカラムを指定して移行します。このとき、指定されなかったカラムには NULL が格納されます。
-- 仕入先名を顧客名として、都市名と国情報とともにコピーします
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers;4.2 すべてのカラムをコピーする
すべてのカラムのデータを一括で挿入します。
-- すべての仕入先データを顧客テーブルにそのまま挿入します
INSERT INTO Customers
SELECT * FROM Suppliers;4.3 特定の条件でコピーする
WHERE 句を併用して、ドイツ(Germany)の仕入先のみをコピーする例です。
-- ドイツの仕入先のみをフィルタリングして顧客テーブルに追加します
INSERT INTO Customers (CustomerName, City, Country)
SELECT SupplierName, City, Country FROM Suppliers
WHERE Country = 'Germany';