既存の行を置き換えてマージ操作を実現する
手順で説明しているマージオペレーションを実行するときは、一時的なステージングテーブルの作成と削除のステップを除き、すべてのステップを 1 つのトランザクションにまとめます。いずれかのステップが失敗した場合でも、トランザクションはロールバックされます。トランザクションを 1 つにすると、ほかにもコミットの回数が減るため、時間とリソースの節約になります。
既存の行を置き換えてマージ操作を実現するには、以下の手順を実行します。
-
次の疑似コードに示すように、ステージングテーブルを作成し、マージの対象となるデータを移します。
create temp table stage (like target); insert into stage select * from source where source.filter = 'filter_expression';
-
ステージングテーブルで内部結合を使用して、ターゲットテーブルから更新の対象となる行を削除します。
問題が発生した場合に全体をロールバックできるよう、削除操作と挿入操作を単一のトランザクションにまとめます。
begin transaction; delete from target using stage where target.primarykey = stage.primarykey;
-
ステージングテーブルからすべての行を挿入します。
insert into target select * from stage; end transaction;
-
ステージングテーブルを削除 (Drop) します。
drop table stage;