SELECT INTOでテーブルのデータを複製する [SQLServer]

プログラムの登録、更新、削除のテストをしていると、操作対象のテーブルのデータを一旦退避させたり、テスト用に本番データベースのテーブルをコピーしたりする時があります。

そこで今回は、SQLServerで既存のテーブルのデータをもとに、SELECT INTOステートメントで新しいテーブルを複製する方法を紹介します。

使用するテーブルの準備

SELECT INTOステートメントでテーブルを複製するサンプルのSQLを実行するために簡単なテーブルを作成します。
作成するテーブルは顧客IDと氏名を持つ顧客テーブルと、顧客テーブルの1件のレコードに対して複数件のレコードが紐づく顧客電話番号テーブルです。

テーブルの定義

顧客テーブルと顧客電話番号テーブルの定義は次のようにします。

顧客テーブル
列名 データ型 PK
顧客ID INT
顧客名 NVARCHAR(50)
顧客電話番号テーブル
列名 データ型 PK
顧客ID INT
電話番号 NVARCHAR(20)

テーブルの作成とデータの登録

テーブルを作成するCREATE文のSQLと、データを登録するINSERT文のSQLを記載します。

CREATE文

INSERT文

SELECT INTOでテーブルを複製

SELECT INTOステートメントは、SELECTステートメントとINSERT INTOステートメントを組み合わせたような構文をしています。

SELECTステートメントでテーブルからデータを取得する場合は、以下のようなSQLを実行します。

INSERT INTOステートメントでテーブルにデータを挿入する場合は、以下のようなSQLを実行します。

INSERT INTOステートメントでテーブルからテーブルへデータを挿入する場合は、以下のようなSQLを実行します。

SELECT INTOステートメントは次のような構文で使用します。

INSERT INTOステートメントの「INSERT」部分を「SELECT *」に変更、またはSELECTステートメントの「SELECT * FROM」の「*」と「FROM」の間に「INTO [複製として作成するテーブル]」を挟む感じです。

SELECT INTOステートメントの構文は大きく「SELECT句」「INTO句」「FROM句」の3つの要素で構成されています。
「SELECT句」が「何を?」⇒ 列
「INTO句」が「どこに?」⇒ 作成するテーブル
「FROM句」が「どこから?」⇒ 作成のもとになるテーブル
をそれぞれ指定します。

顧客テーブルを例に、SELECT INTOステートメントで複製(コピー)テーブルを作成すると次のようになります。

実行結果

顧客テーブルの複製テーブルをSELECT INTOで作成

SELECT INTOステートメントで複製として作成したテーブルには、複製の作成元のテーブルのプライマリキーキーまではコピーされません。

顧客コピー1テーブルの定義

顧客コピー1テーブルの定義

上記の顧客テーブルの複製を作成するSELECT INTOステートメントでプライマリキーを設定するのであれば、ALTER TABLEステートメントを使用して以下のようにします。

顧客コピー1テーブルの定義

プライマリキーを作成した場合の顧客コピー1テーブルの定義

SELECT INTOステートメントでは、複製の作成元のテーブルに一部の列のみをコピーすることや、特定の条件に一致するレコードをもとにコピーすることも可能です。

一部の列のみをコピー

次のSQLは顧客テーブルの顧客IDのみを顧客コピー2というテーブル名で複製しています。

顧客コピー2テーブルのデータ

顧客テーブルの顧客IDのみ複製したテーブルのデータ

特定の条件に一致するレコードのみコピー

次のSQLは顧客テーブルの顧客IDが3以下のレコードのみを顧客コピー3というテーブル名で複製しています。

顧客コピー3テーブルのデータ

顧客テーブルの顧客IDが3以下のレコードのみ複製したテーブルのデータ