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文

上記の顧客テーブルへのデータのインサートは、複数のレコードを1回のSQLで一括挿入する形式で記述しています。
1回のINSERTで複数行のレコードをテーブルに一括して挿入する方法については、以下の記事を参照してください。

1回のINSERT(インサートSQL)で複数行のレコードを一括挿入(追加)する
SQLServerやMySQLなどのデータベースで、テーブルにレコードを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以下のレコードのみ複製したテーブルのデータ