Firebirdの”UPDATE OR INSERT”を使用する

“UPDATE OR INSERT”は、MATCHING句の列の値と一致するレコードがあればUPDATE、なければINSERTします。

■Primary Keyがある場合

Primary Keyがある場合は、MATCHING句を使用しなくても自動的にPrimary Keyが使用されます。

CREATE TABLE "CLASSMATE" 
(
  "ID" INTEGER PRIMARY KEY,
  "NAME" VARCHAR(10),
  "CLASS" INTEGER,
  "SCORE" INTEGER
);
INSERT INTO "CLASSMATE" ("ID", "NAME", "CLASS", "SCORE")
VALUES (1, '野比 のび太', 1, 20);
ID NAME CLASS SCORE
1 野比 のび太 1 20

ID=2のレコードに値を設定します。
該当するレコードがないため、INSERTされます。

update or insert into CLASSMATE (ID, NAME, CLASS, SCORE) 
values (2, '源 静香', 2, 80)
ID NAME CLASS SCORE
1 野比 のび太 1 20
2 源 静香 2 80

ID=2のレコードに値を設定します。
該当するレコードがあるため、UPDATEされます。

update or insert into CLASSMATE (ID, NAME, CLASS, SCORE) 
values (2, '出木杉 英才', 2, 100)
ID NAME CLASS SCORE
1 野比 のび太 1 20
2 出木杉 英才 2 100

■Primary Keyがない場合

Primary Keyがある場合は、MATCHING句でレコードを指定します。

テストデータの作成

CREATE TABLE "CLASSMATE" 
(
  "NAME" VARCHAR(10),
  "CLASS" INTEGER,
  "SCORE" INTEGER
);
INSERT INTO "CLASSMATE" ("NAME", "CLASS", "SCORE") 
VALUES ('野比 のび太', 1, 20);
NAME CLASS SCORE
野比 のび太 1 20

NAME=’源 静香’のレコードに値を設定します。
該当するレコードがないため、INSERTされます。

update or insert into CLASSMATE (NAME, CLASS, SCORE) 
values ('源 静香', 2, 80)
matching(NAME)
NAME CLASS SCORE
野比 のび太 1 20
源 静香 2 80

NAME=’野比 のび太’のレコードに値を設定します。
該当するレコードがあるため、UPDATEされます。

update or insert into CLASSMATE (NAME, CLASS, SCORE) 
values ('野比 のび太', 1, 30)
matching(NAME) 
NAME CLASS SCORE
野比 のび太 1 30
源 静香 2 80

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください