以下の違いがわからなかったのでメモ。(久々に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という単語でしっくりくるかもです。
おわり
コメント