“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 |
