世間ではUPSERTというらしい
そもそもUPSERTを知らなかった。
長いことOracleのSQL書いてたけど、いつのまにそんな便利なものができていたのか。
あ、でも、MERGEなら使ったことあるかも。UPSERTはMERGEのエイリアスらしい。
OracleとMySQLで記法が違うみたいなので、差がわかるように書いておく。
ChatGPT による説明
Oracle の Merge と MySQL の ON DUPLICATE KEY UPDATE とは
OracleのMergeとMySQLのON DUPLICATE KEY UPDATEは、両方ともUPSERT(UPDATEまたはINSERT)と呼ばれる操作を実行するためのSQL文法であり、データベースのテーブルにレコードを挿入する際に、既存のレコードを更新するか新しいレコードを挿入するかを判断することができます。
共通点と相違点
共通点
-
両方の操作は、テーブル内の重複する行を特定するために、一意制約(unique constraint)やプライマリキー(primary key)の使用が必要です。
-
両方の操作は、データベースのパフォーマンスを向上させることができます。従来のUPDATEとINSERT文よりも効率的に、一意な識別子を使用してデータを更新することができます。
相違点
-
OracleのMergeは、マッチングするレコードを更新するために、更新条件を指定することができます。MySQLのON DUPLICATE KEY UPDATEでは、重複するキーが見つかった場合に更新される列と値を指定することができます。
-
OracleのMergeは、複数のテーブルからデータをマージすることもできます。MySQLのON DUPLICATE KEY UPDATEは、INSERTするテーブル内の既存のレコードを更新する場合に使用されます。
OracleのMergeは、テーブル内の更新が必要なレコードのみを更新します。MySQLのON DUPLICATE KEY UPDATEは、重複するキーが存在する場合はすべての行が更新されます。
OracleでのUPSERT(MERGE)
例えばこんな感じ。
キーが一致する時はMATCHED句(UPDATE)、そうでもないときはNOT MATCHED句(INSERT)が動く。
MERGE INTO table1
USING table2
ON (table1.id = table2.tab1_id)
WHEN MATCHED THEN
UPDATE SET
col1 = table2.col1,
col2 = table2.col2
WHEN NOT MATCHED THEN
INSERT (col1, col2)
VALUES (table2.col1, table2.col2) ;
参考:
https://www.shift-the-oracle.com/sql/merge.html
MySQLでのUPSERT(ON DUPLICATE KEY UPDATE)
キーが一致するかどうかで振る舞いが決まるのは、Oracleと同じ。
一致する時はINSERTとして動く、そうでもないときはON DUPLICATE KEY UPDATE句が動く。
INSERT INTO table1(col1, col2)
SELECT col1, col2 FROM table2
ON DUPLICATE KEY UPDATE
col1=table2.col1,
col2=table2.col2;
参考:
https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html
プログラムで条件分岐しなくていいって、楽ねー。