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

ぽにょろん

思いついたこととメモ

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

Firebird SQL

実は過去に、こんな記事を書いていました。
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」の方が分かりやすそうですね。