開発の際、SQL でデータを更新したが考慮が漏れており、結果が想定と異なって更新されてしまうことがあるかと思います。
一度誤って更新をしてしまうと、データ量によっては再度テーブルの入れ替えが必要であったり、かなり手間がかかってしまうことがあります。
今回の記事では、TRANSACTION を使用して結果を確認してから更新を行う方法をご紹介したいと思います。
データベースの TRANSACTION とは
TRANSACTION とは、一連の処理をひとまとめにしたものです。
更新や削除といった複数の変更を行う際、その内容をまとめて扱いたい場合等に使用すると便利です。
- SQL Server の TRANSACTION learn.microsoft.com
環境
今回は下記の環境で行いました。
Oracle Database や PostgreSQL でもそれぞれの構文で同様のことが可能です。
データベース
- Microsoft SQL Server 2017 Developer Edition
- SQL Server Management Studio
テーブル
- レイアウト
テーブル名 | 列名 | データ型 |
---|---|---|
SampleTable | ColInt | int |
ColVarchar | varchar(50) |
- データ
ColInt | CorVarchar |
---|---|
1 | AAA |
2 | BBB |
3 | CCC |
結果を確認してから更新を行う SQL の例
TRANSACTION を ROLLBACK で実行し変更される内容を確認します。
変更内容が問題ないと確認できた後、COMMIT で 変更を反映させます。
変更内容の確認用の SQL
変更後のデータを SELECT し TRANSACTION を ROLLBACK することで、データを変更せず結果を確認することができます。
-- 変更前のデータを確認する
SELECT * FROM SampleTable
WHERE ColInt = 2
OR ColInt = 3
-- データを Update する
UPDATE SampleTable
SET ColVarchar = 'XXX'
WHERE ColInt = 2
-- データを Delete する
DELETE SampleTable
WHERE ColInt = 3
-- 変更後のデータを確認する
SELECT * FROM SampleTable
WHERE ColInt = 2
OR ColInt = 3
ROLLBACK
変更内容の確認用の SQL の結果
下記、SQL Server Management Studio での「変更内容の確認用の SQL」の実行結果になります。
変更後のデータを SELECT し、変更内容が想定通りであることを確認します。
また、変更後のデータを SELECT した後に ROLLBACK しているため、データは変更前の状態に戻ります。
変更用の SQL
「変更内容の確認用の SQL」で ROLLBACK していた TRANSACTION を COMMIT するようにします。
-- 変更前のデータを確認する
SELECT * FROM SampleTable
WHERE ColInt = 2
OR ColInt = 3
-- データを Update する
UPDATE SampleTable
SET ColVarchar = 'XXX'
WHERE ColInt = 2
-- データを Delete する
DELETE SampleTable
WHERE ColInt = 3
-- 変更後のデータを確認する
SELECT * FROM SampleTable
WHERE ColInt = 2
OR ColInt = 3
COMMIT
変更用の SQL の結果
下記、「変更用の SQL」の実行結果になります。
「変更内容の確認用の SQL の結果」と表示される結果は同じですが、COMMIT を行っているため変更内容が確定し反映されます。
おわりに
私自身、本番データ等の失敗したくないデータの変更の時によく活用しています。
この記事が参考になれば幸いです。