My開発メモ

データがなければ挿入、あれば更新をいっぺんにする(SQL:MERGE)

以下のようなテーブルがあるとする。

CREATE TABLE users (
  id VARCHAR(100) primary key,
  name VARCHAR(100)
);

INSERT INTO users (id, name) VALUES
('001', 'Ichiro'),
('002', 'Kiyoko');

これに対して、以下のようなSQL文を用意する。
プログラムの中で使えるように、プレースフォルダーを
使った。

MERGE INTO users  
  USING (  
    SELECT CAST(? AS VARCHAR(100)) AS id,
           CAST(? AS VARCHAR(100)) AS name  
  ) AS data  
  ON users.id = data.id  
WHEN MATCHED THEN  
  UPDATE SET name = data.name
WHEN NOT MATCHED THEN
  INSERT (id, name)  
  VALUES (data.id, data.name)

たとえば、次のようにセットする。

pStmt.setString(1, "003");
pStmt.setString(2, "Jiro");

この場合は、挿入処理がおこなわれる。

また、次のようなデータであれば、

pStmt.setString(1, "002");
pStmt.setString(2, "Tomoyo");

更新処理が行われる。

カテゴリー: mariadb, memo, mysql, mysql8, SQL

タグ: merge, using

カウント: 172