【SQL】TRANSACTION を使用し結果を確認してから更新する

開発の際、SQL でデータを更新したが考慮が漏れており、結果が想定と異なって更新されてしまうことがあるかと思います。

一度誤って更新をしてしまうと、データ量によっては再度テーブルの入れ替えが必要であったり、かなり手間がかかってしまうことがあります。

今回の記事では、TRANSACTION を使用して結果を確認してから更新を行う方法をご紹介したいと思います。

データベースの TRANSACTION とは

TRANSACTION とは、一連の処理をひとまとめにしたものです。

更新や削除といった複数の変更を行う際、その内容をまとめて扱いたい場合等に使用すると便利です。

環境

今回は下記の環境で行いました。

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 することで、データを変更せず結果を確認することができます。

BEGIN TRANSACTION

    -- 変更前のデータを確認する
    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」の実行結果になります。

変更結果の確認用の SQL の結果
変更結果の確認用の SQL の結果

変更後のデータを SELECT し、変更内容が想定通りであることを確認します。

また、変更後のデータを SELECT した後に ROLLBACK しているため、データは変更前の状態に戻ります。

変更用の SQL

「変更内容の確認用の SQL」で ROLLBACK していた TRANSACTION を COMMIT するようにします。

BEGIN TRANSACTION

    -- 変更前のデータを確認する
    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 の結果
変更用の SQL の結果

「変更内容の確認用の SQL の結果」と表示される結果は同じですが、COMMIT を行っているため変更内容が確定し反映されます。

おわりに

私自身、本番データ等の失敗したくないデータの変更の時によく活用しています。

この記事が参考になれば幸いです。

執筆担当者プロフィール
石橋 侑樹

石橋 侑樹(日本ビジネスシステムズ株式会社)

これまで業務システムやWebアプリの開発、業務自動化等に携わってきました。サッカーが好きで休日は試合を見ていることが多いです。

担当記事一覧