いつもお世話になっております。
RfromL.comです。
SQLServerにおいて、select intoでバックアップしたテーブルからテーブルデータを復元する方法についてです。
1.はじめに
select into でテーブルデータをバックアップしておく方法について「【SQL Server】既存テーブルからレイアウトとデータをコピーして新規テーブルを作成する【Select into】」で記載しましたが、今回はselect into でバックアップしたテーブルからバックアップ元のテーブルを復元する方法について記載します。
なお、使用した環境は以下のバージョンとなっています。
OS | Windows11 Home 64ビット |
DBMS | SQL Server 2019 |
統合環境 | SQL Server Management Studio v18.10 |
2.select into の構文
構文は以下の通りです。
INSERT INTO [テーブルA] ( [field1], [field2], ... )
SELECT [field1], [field2], ... FROM [テーブルB]
[テーブルA]が挿入先のテーブル
[テーブルB]が挿入元のテーブル
[field1],[field2], … は項目名
つまり[テーブルB] から[テーブルA]にデータを挿入(insert)する。
ということになります。
また、挿入元と挿入先の両方に項目を指定できるようになっていますが、同一レイアウトのテーブル同士であれば、項目の数も項目の型も一致しているので項目指定の部分は省略して以下のようにも書けます。
INSERT INTO [テーブルA]
SELECT * FROM [テーブルB]
今回はselect intoでバックアップしておいたテーブルからselect insertするので項目名を省略した書き方を使います。
実行に際しては、挿入先のテーブルとして[価格情報]が用意されているものとし、バックアップテーブルとして[価格情報_BK20250411]というテーブルの用意については実行手順に含めます。
ここまでの情報を踏まえて今回実行するSQL文は以下の通りとなります。
INSERT INTO 価格情報
SELECT * FROM 価格情報_BK20250411
3.テスト環境
テスト用に用意したテーブルとテーブルデータの情報です。
3-1.テーブル
テスト用に作成したテーブルは「価格情報」テーブルです。
[価格情報]テーブル レイアウト
No | 項目名 | データ型 | KEY |
---|---|---|---|
1 | 銘柄コード | char | ○ |
2 | 価格 | numeric | |
3 | 利回り | numeric | |
4 | NAV | numeric | |
5 | NAV倍率 | numeric | |
6 | 時価総額 | numeric | |
7 | 出来高 | numeric | |
8 | 基準年月日 | char | ○ |
[テーブルクリエイト文]
CREATE TABLE [dbo].[価格情報](
[銘柄コード] [char](4) NOT NULL,
[価格] [numeric](18, 0) NOT NULL,
[利回り] [numeric](9, 2) NOT NULL,
[NAV] [numeric](12, 0) NOT NULL,
[NAV倍率] [numeric](9, 2) NOT NULL,
[時価総額] [numeric](12, 0) NOT NULL,
[出来高] [numeric](12, 0) NOT NULL,
[基準年月日] [char](8) NOT NULL,
PRIMARY KEY CLUSTERED
(
[銘柄コード] ASC,[基準年月日] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
3-2.データ
テスト用テーブル「価格情報」テーブルには以下のデータを投入しておきます。
[ 投入データ ]
銘柄コード | 価格 | 利回り | NAV | NAV倍率 | 時価総額 | 出来高 | 基準年月日 |
---|---|---|---|---|---|---|---|
8991 | 99200 | 5.40 | 123268 | 0.80 | 46336 | 1885 | 20250327 |
8992 | 154500 | 3.42 | 128871 | 1.20 | 105310 | 417 | 20250327 |
9997 | 118000 | 5.55 | 123495 | 0.96 | 41532 | 1051 | 20250327 |
9998 | 116700 | 5.61 | 123495 | 0.94 | 41075 | 1585 | 20250327 |
9999 | 99300 | 5.40 | 123268 | 0.81 | 46383 | 3344 | 20250327 |
[データインサート文]
insert into 価格情報 values(8991,99200,5.40,123268,0.80,46336,1885,20250327)
insert into 価格情報 values(8992,154500,3.42,128871,1.20,105310,417,20250327)
insert into 価格情報 values(9997,118000,5.55,123495,0.96,41532,1051,20250327)
insert into 価格情報 values(9998,116700,5.61,123495,0.94,41075,1585,20250327)
insert into 価格情報 values(9999,99300,5.40,123268,0.81,46383,3344,20250327)
4.実行
実行前の前提として[価格情報]テーブルが作成されていて、中にデータが投入されているものとします。
ここでは以下の流れでテストを行います。
①[価格情報]テーブルの情報を確認
②select-intoを実行してテーブルをコピーして「価格情報_BK20250411」を作成します。
③コピー先の新規テーブル「価格情報_BK20250411」の内容を確認します。
④コピー元のテーブル「価格情報」のデータ内容に変更を行います。
⑤「価格情報」テーブルをselectして更新内容を確認します。
⑥コピー元のテーブル「価格情報」のデータを削除します。
⑦コピー元のテーブル「価格情報」のデータ内容が削除されていることを確認します。
⑧コピー作成したテーブル「価格情報_BK20250411」からinsert intoで「価格情報」テーブルのデータを復元します。
⑨テーブル「価格情報」をselectしてデータが復元されていることを確認します。
上記手順の「⑥~⑨」がデータ復元のための手順となっています。
それでは実際に実行していきます。
①[価格情報]テーブルの情報を確認します。
[実行 SQL文 ]
select * from 価格情報

②select-intoを実行してテーブルをコピーして「価格情報_BK20250411」を作成します。
[ 実行SQL文 ]
select * into 価格情報_BK20250411 From 価格情報

③コピー先の新規テーブル「価格情報_BK20250411」の内容を確認します。
[ 実行SQL文 ]
select * 価格情報_BK20250411

④コピー元のテーブル「価格情報」のデータ内容に変更を行います。
なんらかの処理を実行したり、テスト用にデータを編集したりすることを想定します。
ここでは基準年月日を「20250101」に更新します。
[実行SQL文]
update 価格情報 set 基準年月日 = '20250101';

⑤「価格情報」テーブルをselectして更新内容を確認します。
[実行SQL文]
select * from 価格情報

⑥コピー元のテーブル「価格情報」のデータを削除します。
[ 実行SQL文 ]
delete 価格情報
※ここではdelete文を使っていますが、全件削除なのでtruncateでも良いです。

⑦コピー元のテーブル「価格情報」のデータ内容が削除されていることを確認します。
[実行SQL文]
select * from 価格情報

⑧コピー作成したテーブル「価格情報_BK20250411」からinsert intoで「価格情報」テーブルのデータを復元します。
[実行SQL文]
insert into 価格情報 select * from 価格情報_BK20250411

⑨テーブル「価格情報」をselectしてデータが復元されていることを確認します。
[実行SQL文]
select * from 価格情報

基準年月日が「20250327」のデータで復元されていることを確認。
5.おわりに
今回、実行手順で行ったテスト時の更新を想定したデータの更新は基準年月日を’20250101’に変更しただけです。なのでこの場合のデータ復元に関しては、もう一度Update文で基準年月日を’20250327’に更新し直せば良いものですがあくまでテスト時の更新例です。
実際テストしている時などは一部のレコードを削除したり、一部の項目を更新したり、レコードを追加したりとテスト実施後に完全に戻すのが手間になっている状態になります。
そういった場合に、一旦全部削除してバックアップデータから復元してしまった方が手っ取り早かったりします。
復元が完了したら、バックアップしておいたテーブルについては残しておく理由が無ければdrop tableで削除しておくことも忘れずに。
[実行SQL文]
drop table 価格情報_BK20250411

以上です。
宜しくお願い致します。