Firebirdでテーブル状態に合わせてINSERTとUPDATEを実行する
実は過去に、こんな記事を書いていました。
ponyoth.hateblo.jp
上記のFirebird版になります。
データ更新の際に、すでに該当行があればUPDATE、なければINSERTする単純な例です。
ただし、Firebirdには「UPDATE OR INSERT」という構文があります。
そのため、「MERGE」と「UPDATE OR INSERT」を並記します。
目次
検証環境
- Firebird 2.5.5
テスト用テーブルの作成
create table MergeTest( Id int unique not null, Memo varchar(200) ); insert into MergeTest values(1, 'test1'); insert into MergeTest values(2, 'test2'); insert into MergeTest values(3, 'test3'); insert into MergeTest values(4, 'test4');
「MERGE」の場合
merge into MergeTest as t using (select 4 Id, 'change' Memo from MergeTest) as s on (t.Id = s.Id) when matched then update set t.Memo = s.Memo when not matched then insert (Id, Memo) values(s.Id, s.Memo); merge into MergeTest as t using (select 5 Id, 'test5' Memo from MergeTest) as s on (t.Id = s.Id) when matched then update set t.Memo = s.Memo when not matched then insert (Id, Memo) values(s.Id, s.Memo);
リファレンスはこちら。
MERGE
「UPDATE OR INSERT」の場合
update or insert into MERGETEST (ID, MEMO) values (4, 'change') matching (ID); update or insert into MERGETEST (ID, MEMO) values (5, 'test5') matching (ID);
リファレンスはこちら。
UPDATE OR INSERT
結果
「MERGE」は他のRDBMSと同じように書けます。
今回の目的の場合は、「UPDATE OR INSERT」の方が分かりやすそうですね。