MySQL 速習チュートリアル

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(顧客)」テーブルからの抜粋です:

CustomerIDCustomerNameContactNameAddressCityPostalCodeCountry
1Alfreds FutterkisteMaria AndersObere Str. 57Berlin12209Germany
2Ana Trujillo Emparedados y heladosAna TrujilloAvda. de la Constitución 2222México D.F.05021Mexico
3Antonio Moreno TaqueríaAntonio MorenoMataderos 2312México D.F.05023Mexico

次に、「Suppliers(仕入先)」テーブルの抜粋です:

SupplierIDSupplierNameContactNameAddressCityPostalCodeCountry
1Exotic LiquidCharlotte Cooper49 Gilbert St.LondonEC1 4SDUK
2New Orleans Cajun DelightsShelley BurkeP.O. Box 78934New Orleans70117USA
3Grandma Kelly's HomesteadRegina Murphy707 Oxford Rd.Ann Arbor48104USA

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';