whereをon update とdo update のどちらに付けるかの違い

以下の違いがわからなかったのでメモ。(久々にChatGPTにきいても分からんかったやつ)


# 1
insert into employees (employee_id, name)
values (123, '山田')
on conflict (employee_id) where name <> '山田'
do update set name = excluded.name;

# 2
insert into employees (employee_id, name)
values (123, '山田')
on conflict (employee_id) do update set name = excluded.name
where name <> '山田';

引用:https://orm.drizzle.team/docs/insert

1.のほうのwhere name <> '山田'nameは、挿入しようとしているnameを指します。要するにvalues (123, '山田')である「山田」を指します。

競合が発生したとき、挿入しようとしているnameが「山田」じゃなかったら、そのまま競合を発生させるという意味になります(競合が発生するので結果的に更新される)。

2.のほうのwhere name <> 'John';nameは、更新をかけようとしている行のnameカラムを指します。

競合が発生したとき、そのまま競合を発生させるので、結果的に更新されますが、更新をかけようとしている行のnameが「山田」じゃなかった場合のみ更新するという意味になります。

正直、どちらもあまり使う機会がない気がします?

ちなみにexcluded.name;のexcludedは「挿入されずに除外されたやつ」という意味で考えると、excludedという単語でしっくりくるかもです。

おわり

未分類
スポンサーリンク
この記事を書いた人
penpen

1991生まれ。WEBエンジニア。

技術スタック:TypeScript/Next.js/Express/Docker/AWS

フォローする
フォローする

コメント

タイトルとURLをコピーしました