サーバー内テストという言葉をご存じでしょうか?
プログラムを組んだ後で、そのプログラムを実際に使用して登録や更新、削除などのテストをすることを指します。
通常このテストは複数回に渡り行うため、テストサーバー内のデータを複製したり、本サーバーからデータを引っ張ってきてテストサーバー内で反映させます。
そこで今回はこの「SQL コピー」について解説してみようと思います。
プログラムを学習している方は頻繁にテストを行うと思いますので、データのコピーを覚えておくことで飛躍的に効率も上がります。
是非最後まで読んでみてください。
手順の説明
本記事の解説ではデータを用意するところから解説していきます。
作業の順番は次の通りです。
- テーブルを準備する
- サンプルデータを作成・登録する
- サンプルデータを複製する
3の「サンプルデータを複製する」では「SELECT INTO構文」を使用します。
1と2に関しては予め学習されている方であれば問題ないと思いますが、初めて学習する方のために、今回はこの辺りについても簡単に触れていきたいと思います。
テーブルを準備する
まずはテストデータを格納するためのテーブルを作成していきましょう。
今回使用するサンプルテーブルの定義は次の通りとします。
// スタッフテーブル スタッフID スタッフ名 ----------- -------------------- // スタッフ電話番号テーブル スタッフID 電話番号 ----------- --------------------
テーブルを作成するにはCREATE文を使用します。
CREATE文の基本記述は次の通りです。
CREATE TABLE テーブル名 (カラム名 データ型 制約の設定);
今回のテーブルについてはテーブルを二つ作りますので、まず初めに「スタッフ」という名前のテーブル、続いて「スタッフ電話番号」という名前のテーブルをCREATEします。
// スタッフテーブルの作成 CREATE TABLE [スタッフ] ( [スタッフID] [int] NOT NULL, [スタッフ名] [nvarchar](50) NOT NULL, CONSTRAINT [PK_スタッフ] PRIMARY KEY CLUSTERED ( [スタッフID] ASC ) ); GO //スタッフ電話番号テーブルの作成 CREATE TABLE [スタッフ電話番号] ( [スタッフID] [int] NOT NULL, [電話番号] [nvarchar](20) NOT NULL, CONSTRAINT [PK_スタッフ電話番号] PRIMARY KEY CLUSTERED ( [スタッフID] ASC, [電話番号] ) ); GO
これで空のテーブルが二つ作成されたはずです。
CONSTRAINTについては別の記事で解説していますので、今回は解説を省略します。
気になる方はそちらの記事をご覧ください。
サンプルデータを作成・登録する
次に先ほど作成したテーブルにサンプルデータを登録していきます。
データの登録にはINSERT文を使用します。
INSERT文の基本記述は次の通りです。
INSERT INTO tbl_name (col_name1, col_name2, ...) VALUES (value1, value2, ...)
またデータの登録にはいくつかの方法がありますが、今回は複数レコードを1度のSQL文でまとめて登録する形式を採用しています。
INSERT INTO [スタッフ] ([スタッフID], [スタッフ名]) VALUES (1, 'スタッフ名1'), (2, 'スタッフ名2'), (3, 'スタッフ名3'), (4, 'スタッフ名4'), (5, 'スタッフ名5'); GO
今回は5件のデータを追加しました。
サンプルデータを複製する
ここからは本記事の本題に入ります。
SELECT INTO構文は簡単に言い換えると「SELECTの検索結果をそのままINSERTする」と言うことになります。
まだ慣れていない方も、SELECT構文とINSERT構文を一つずつ考えていくと非常に理解しやすいと思いますので、この記事では砕いて解説していきます。
まずSELECT構文についてですが、基本記述は次の通りです。
SELECT [column] FROM [table]
またINSERT構文に関しては一つ前の項目で基本記述を明記しています。
この二つを同時に使うことが出来れば完成ですが、INSERT構文にも同じように同時に使える記述方式がありますので、それぞれの違いを見ていきましょう。
まずはよく間違えられがちなINSERT構文の中でSELECT構文を使用する方法についてです。
INSERT INTO [スタッフ電話番号] ( [スタッフID], [電話番号] ) SELECT [スタッフID] FROM [スタッフ];
こちらは最初に「目的とする命令」である”INSERT”があります。
砕いて解説するなら「SELECTの検索結果(カラム)」に「INSERTする」という形となります。
続いて今回の本題となっているSELECT INTO構文の基本記述です。
SELECT * INTO [複製として作成するテーブル] FROM [複製の作成元のテーブル];
SELECT INTO構文では、まず最初に「目的とする命令」の部分が”SELECT”となっていることがわかります。
また、使い方を比較しても、INSERTはレコードを追加する目的で使用しますが、SELECT INTOはテーブルの複製で使用します。
双方にINTOがありますので、学習中の方は混同しないように注意してください。
サンプルコード
それでは実際にSELECT INTOを使ったサンプルコードを見てみましょう。
SELECT * INTO [スタッフコピー1] FROM [スタッフ]; GO (5 行処理されました) // テーブルを確認する SELECT * FROM スタッフコピー1; GO スタッフID スタッフ名 ----------- -------------- 1 顧客名1 2 顧客名2 3 顧客名3 4 顧客名4 5 顧客名5
確認のためにSELECTで検索をかけていますが、別テーブル(スタッフコピー1)が複製されていることが確認できます。
但しSELECT INTOで複製したテーブルは、複製元テーブルのインデックスまでは引き継ぎません。
よって、プライマリーキーの設定をする場合には次のように記述する必要があります。
SELECT * INTO [スタッフコピー1] FROM [スタッフ]; // 複製したテーブルのプライマリキーを追加する ALTER TABLE [スタッフコピー1] ADD CONSTRAINT [PK_スタッフコピー1] PRIMARY KEY ([スタッフID]);
このように記述することで、プライマリーキーも同時に設定することが可能です。
条件付きコピー
最後に、SELECT INTO構文で特定条件に一致するレコードのみをコピーする方法について解説していきます。
もうお気づきの方もいるかもしれませんが、基本的な構文は「SELECT」と同じであるため、WHEREなどの条件指定が利用できます。
これを使ってコピーをすることで、条件付きコピーが実行できます。
SELECT * INTO [スタッフコピー2] FROM [スタッフ] WHERE [スタッフID] <= 3; GO (3 行処理されました) SELECT * FROM スタッフコピー2; GO スタッフID スタッフ名 ----------- -------------- 1 スタッフ名1 2 スタッフ名2 3 スタッフ名3
複製元となるテーブルには5件のレコードがありますが、WHEREでIDが3以下のレコードのみと指定することで実行件数が3件となっていることが確認できます。
まとめ
今回はテーブルの複製に欠かせない「SELECT INTO」について解説してきましたが、いかがでしたか?
今回解説したSELECTもINSERT構文と同じくINTOを使っていますので、学習時間の少ない方にとってはよく間違えてしまう部分でもあります。
目的が全く違うため、しっかりと違いを把握しておきましょう。