読者です 読者をやめる 読者になる 読者になる

ぽにょろん

思いついたこととメモ

Firebirdでテーブル状態に合わせてINSERTとUPDATEを実行する

実は過去に、こんな記事を書いていました。
ponyoth.hateblo.jp

上記のFirebird版になります。
データ更新の際に、すでに該当行があればUPDATE、なければINSERTする単純な例です。

ただし、Firebirdには「UPDATE OR INSERT」という構文があります。
そのため、「MERGE」と「UPDATE OR INSERT」を並記します。

目次

検証環境

テスト用テーブルの作成

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');

f:id:kowill:20160613170435p:plain

「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

結果

f:id:kowill:20160613170440p:plain

「MERGE」は他のRDBMSと同じように書けます。
今回の目的の場合は、「UPDATE OR INSERT」の方が分かりやすそうですね。